zwiń komórkę w notatniku jupyter


143

Używam notebooka ipython Jupyter. Powiedzmy, że zdefiniowałem funkcję, która zajmuje dużo miejsca na moim ekranie. Czy istnieje sposób na zawalenie komórki?

Chcę, aby funkcja była nadal wykonywana i wywoływana, ale chcę ukryć / zwinąć komórkę, aby lepiej wizualizować notatnik. W jaki sposób mogę to zrobić?


30
Wow, to już 2017 rok i nie ma prostego rozwiązania
— user1700890

31
2019 i wciąż liczę
— Hardian Lawi

23
2020 ... (pierwszy!)
— itzy

5
Ach, wstawię przypomnienie, żebym mógł być pierwszy w 2021 roku
— nowicjusz

6
JupyterLab ma to od 2019 roku. Podświetl komórkę, a następnie kliknij niebieski pasek obok niej. Teraz zobaczysz to jako trzy kropki. Będzie szanowany, gdy zapiszesz i ponownie otworzysz później lub w innym miejscu. Istnieją dodatkowe funkcje i opcje, takie jak View> Collapse All Code, patrz tutaj i łącze tutaj .
— Wayne

Odpowiedzi:


94

jupyter contrib nbextensionsPakiet Python zawiera kod składane rozszerzenie, które mogą być włączone w notesie. Kliknij link (Github), aby uzyskać dokumentację.

Aby zainstalować za pomocą wiersza poleceń:

pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user

Aby ułatwić sobie życie w zarządzaniu nimi, polecam również jupyter nbextensions configuratorpakiet. Zapewnia to dodatkową kartę w interfejsie notebooka, z której można łatwo (de) aktywować wszystkie zainstalowane rozszerzenia.

Instalacja:

pip install jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable --user

11
Fajne rzeczy, chociaż chciałbym, żeby nbextension „Codefolding” zwijał całe komórki, a nie tylko bloki kodu.
— bsmith89

2
Jeśli ktoś napotka problemy z instalacją conda, spróbuj: pip install jupyter_contrib_nbextensionsthen jupyter contrib nbextensions install --sys-prefix --skip-running-check. Chciałbym, żeby jupyter miał domyślnie ten pakiet.
— user1700890

7
Najprostsza ścieżka instalacji jest przez samego Conda : conda install -c conda-forge jupyter_contrib_nbextensions.
— Max Ghenis

3
Tylko krótka notatka dla każdego, kto używa nowszego JupyterLab. Według wspomnianej witryny GitHub, te rozszerzenia działają w JupyterLab. Sam się nad tym zastanawiałem, więc pomyślałem, że dam znać innym. Cytowanie repo GitHub: Due to major differences between the Jupyter Notebook and JupyterLab, the extensions in this repository will not work in JupyterLab.
— NYCeyes

2
MOŻESZ zwinąć całą komórkę, jeśli umieścisz #koment na górze komórki. Następnie Jupyter dostarcza rozwijaną strzałkę, która zwinie całą komórkę.
— EatSleepCode

27

Możesz utworzyć komórkę i umieścić w niej następujący kod:

%%html
<style>
div.input {
    display:none;
}
</style>

Uruchomienie tej komórki spowoduje ukrycie wszystkich komórek wejściowych. Aby je pokazać, możesz użyć menu, aby wyczyścić wszystkie wyjścia.

W przeciwnym razie możesz wypróbować rozszerzenia notebooków, takie jak poniżej:

https://github.com/ipython-contrib/IPython-notebook-extensions/wiki/Home_3x


Rozszerzenia notebooków są naprawdę dobre. Jest też kilka innych rzeczy. github.com/ipython-contrib/jupyter_contrib_nbextensions
— shahensha

27

JupyterLab obsługuje zwijanie komórek. Kliknięcie niebieskiego paska komórki po lewej stronie spowoduje zawinięcie komórki. wprowadź opis obrazu tutaj


6
nie
— upiera się

Czy jest na to dobre rozwiązanie? Tak bardzo chcę ukryć zwinięte komórki podczas eksportu. Chcę zachować część kodu i część danych wyjściowych oraz ukryć inny kod i wyjście, więc nie mogę po prostu ukryć całego kodu .....
— Russell Richie

2
Kod i dane wyjściowe można zwinąć, jak opisano w tej odpowiedzi. Ponadto informacje są utrwalane. Jest zapisany w metadanych komórki. source_hiddeni outputs_hiddenjest ustawiony. nbformat.readthedocs.io/en/latest/…
— gillesB

16

Miałem podobny problem i "nbextensions" wskazane przez @Energya działały bardzo dobrze i bez wysiłku. Instrukcje instalacji są proste (próbowałem z anacondą w systemie Windows) dla rozszerzeń notebooka i ich konfiguratora .

To powiedziawszy, chciałbym dodać, że następujące rozszerzenia powinny być interesujące.

  • Ukryj wejście | To rozszerzenie umożliwia ukrycie pojedynczego kodekomórki w notebooku. Można to osiągnąć, klikając przycisk paska narzędzi: Ukryj dane wejściowe

  • Zwijane nagłówki | Umożliwia notatnikowi składanie sekcji oddzielonych nagłówkami Zwijane nagłówki

  • Składanie kodu | Zostało to wspomniane, ale dodam to dla kompletności Codefolding


9

Utwórz plik custom.js w ~ / .jupyter / custom / z następującą zawartością:

$("<style type='text/css'> .cell.code_cell.collapse { max-height:30px; overflow:hidden;} </style>").appendTo("head");
$('.prompt.input_prompt').on('click', function(event) {
    console.log("CLICKED", arguments)   
    var c = $(event.target.closest('.cell.code_cell'))
    if(c.hasClass('collapse')) {
        c.removeClass('collapse');
    } else {
        c.addClass('collapse');
    }
});

Po zapisaniu zrestartuj serwer i odśwież notatnik. Możesz zwinąć dowolną komórkę, klikając etykietę wejściową (W []).


3
To nie zadziałało, ponieważ zmieniany div nie jest ładowany, gdy wykonywany jest niestandardowy js. Można to jednak naprawić, opakowując wszystko w setTimeout (function () {...}, 3000);
— Steohan

2
To zadziałało po zmianie czwartej linii na: var c = $(event.target).closest('.cell.code_cell') i po sugestii Steohana, aby zawinąć wszystko w setTimeout.
— proteom

Możesz po prostu użyć c.toggleClass ('collapse'); zamiast instrukcji if-else.
— gouravkr


9

Po pierwsze, postępuj zgodnie z instrukcjami Energya:

pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user
pip install jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable --user

Po drugie: po otwarciu notatnika jupiter kliknij kartę Nbextension. Teraz wyszukaj "colla" z narzędzia wyszukiwania dostarczonego przez Nbextension (nie przez przeglądarkę internetową) , a znajdziesz coś o nazwie "Zwijane nagłówki"

To jest to, czego chcesz!


2

Jak wspominali inni, możesz to zrobić za pomocą nbextensions. Chciałem krótko wyjaśnić, co zrobiłem, co było szybkie i łatwe:

Aby włączyć współpracujące nagłówki: W terminalu włącz / zainstaluj Jupyter Notebook Extensions, wprowadzając najpierw:

pip install jupyter_contrib_nbextensions

Następnie wprowadź:

jupyter contrib nbextension install

Ponownie otwórz notatnik Jupyter. Przejdź do zakładki „Edycja” i wybierz „Konfiguracja nbextensions”. Usuń zaznaczenie pola wyboru bezpośrednio pod tytułem „Konfigurowalne rozszerzenia nbezpłatne”, a następnie wybierz „zwijane nagłówki”.


Zastanawiasz się, dlaczego nie można uzyskać dostępu nbextensions configbezpośrednio z głównego pulpitu nawigacyjnego i zamiast tego należy otworzyć notatnik. Alternatywnie, jak wspominali inni, można uzyskać do niego dostęp przez localhost:8888/nbextensions(lub dowolny port w twojej konfiguracji)
— Antoine

2

Jest wiele odpowiedzi na to pytanie, z których wszystkie uważam za niezadowalające (niektóre bardziej niż inne), spośród wielu rozszerzeń - zwijanie kodu, zwijanie według nagłówków itp. Żaden nie robi tego, co chcę w prosty i skuteczny sposób. Jestem dosłownie zdumiony, że rozwiązanie nie zostało wdrożone (tak jak w przypadku Jupyter Lab).

W rzeczywistości byłem tak niezadowolony, że opracowałem bardzo proste rozszerzenie do notebooka, które może rozszerzać / zwijać kod w komórce notebooka, zachowując jego wykonywalność.

Repozytorium GitHub: https://github.com/BenedictWilkinsAI/cellfolding

Poniżej znajduje się małe demo tego, co robi rozszerzenie:

Dwukrotne kliknięcie po lewej stronie komórki kodu zwinie ją do jednej linii:

Ponowne dwukrotne kliknięcie spowoduje rozwinięcie komórki.

Przedłużenie można łatwo zainstalować za pomocą pip:

pip install nbextension-cellfolding
jupyter nbextension install --py cellfolding --user
jupyter nbextension enable --py cellfolding --user 

i jest również kompatybilny z konfiguratorem nbextension . Mam nadzieję, że ludzie uznają to za przydatne!


2
Działał jak urok. Neat
— Ayan Mitra

1

Istnieje również ulepszona wersja sugestii Pan Yan. Dodaje przycisk, który pokazuje z powrotem komórki kodu:

%%html
<style id=hide>div.input{display:none;}</style>
<button type="button" 
onclick="var myStyle = document.getElementById('hide').sheet;myStyle.insertRule('div.input{display:inherit !important;}', 0);">
Show inputs</button>

Lub python:

# Run me to hide code cells

from IPython.core.display import display, HTML
display(HTML(r"""<style id=hide>div.input{display:none;}</style><button type="button"onclick="var myStyle = document.getElementById('hide').sheet;myStyle.insertRule('div.input{display:inherit !important;}', 0);">Show inputs</button>"""))

2
Kody ukrywają WSZYSTKIE komórki wejściowe, a nie konkretną komórkę.
— Jack Fleeting

Właśnie tego chciałem dla wyjścia, ale możesz zwinąć / ukryć wszystkie dane wyjściowe, przełączając je w menu Jupyter: Komórka> Wszystkie dane wyjściowe> Przełącz
— oznaczanie

Szkoda, to jedyne rozwiązanie, które znalazłem, które domyślnie ukrywa kod i wyświetla go tylko po kliknięciu. Niestety, powoduje to ukrycie wszystkich komórek, a nie tylko jednej docelowej.
— penelopa

@penelope możesz sprawdzić, czy różne komórki mają różne identyfikatory elementów html lub unikalne klasy. Jeśli tak, możesz odpowiednio zmodyfikować moją odpowiedź. Moja odpowiedź dotyczy wszystkich komórek, ponieważ nie różnicuje komórek.
— Peter Zagubisalo

1

Nie musisz robić wiele poza włączaniem rozszerzeń:

http://localhost:8888/nbextensions?nbextension=collapsible_headings
http://localhost:8888/nbextensions?nbextension=codefolding/main

wprowadź opis obrazu tutaj

Najprawdopodobniej znajdziesz tutaj wszystkie swoje rozszerzenia:

http://localhost:8888/nbextensions

wprowadź opis obrazu tutaj


1

Aby uzyskać pożądany efekt, używam:

  1. Zapisz poniższy blok kodu w pliku o nazwie toggle_cell.pyw tym samym katalogu, co w Twoim notatniku
from IPython.core.display import display, HTML
toggle_code_str = '''
<form action="javascript:code_toggle()"><input type="submit" id="toggleButton" value="Show Sloution"></form>
'''

toggle_code_prepare_str = '''
    <script>
    function code_toggle() {
        if ($('div.cell.code_cell.rendered.selected div.input').css('display')!='none'){
            $('div.cell.code_cell.rendered.selected div.input').hide();
        } else {
            $('div.cell.code_cell.rendered.selected div.input').show();
        }
    }
    </script>

'''

display(HTML(toggle_code_prepare_str + toggle_code_str))

def hide_sloution():
    display(HTML(toggle_code_str))
  1. Dodaj następujący tekst w pierwszej komórce notatnika
from toggle_cell import toggle_code as hide_sloution
  1. Dowolna komórka, do której musisz dodać przycisk przełączania, aby po prostu zadzwonić hide_sloution()
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.