Zelle im Jupyter-Notizbuch zusammenbrechen

143

Ich benutze ipython Jupyter Notebook. Angenommen, ich habe eine Funktion definiert, die viel Platz auf meinem Bildschirm einnimmt. Gibt es eine Möglichkeit, die Zelle zusammenzubrechen?

Ich möchte, dass die Funktion ausgeführt und aufrufbar bleibt, aber ich möchte die Zelle ausblenden / reduzieren, um das Notizbuch besser zu visualisieren. Wie kann ich das machen?

Aloha
quelle
30
Wow, es ist schon 2017 und es gibt keine einfache Lösung
user1700890
31
2019 und zählt noch
Hardian Lawi
22
2020 ... (zuerst!)
9.
5
Ah, ich werde eine Erinnerung setzen, damit ich der erste im Jahr 2021 sein kann
Neuling
6
JupyterLab hat dies seit 2019. Markieren Sie eine Zelle und klicken Sie dann auf die blaue Leiste daneben. Sie sehen es jetzt als drei Punkte dargestellt. Es wird respektiert, wenn Sie später oder anderswo speichern und wieder öffnen. Es gibt weitere Funktionen und Optionen, wie View> Collapse All Code, siehe hier und den Link hier .
Wayne

Antworten:

94

Das jupyter contrib nbextensionsPython-Paket enthält eine Code-Folding-Erweiterung, die im Notebook aktiviert werden kann. Folgen Sie dem Link (Github) zur Dokumentation.

So installieren Sie über die Befehlszeile:

pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user

Um die Verwaltung zu vereinfachen, würde ich das jupyter nbextensions configuratorPaket auch empfehlen . Dies bietet eine zusätzliche Registerkarte in Ihrer Notebook-Oberfläche, über die Sie alle installierten Erweiterungen einfach (de) aktivieren können.

Installation:

pip install jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable --user
Energya
quelle
11
Cooles Zeug, obwohl ich mir wünsche, dass die Erweiterung "Codefolding" ganze Zellen falten würde und nicht nur Codeblöcke.
bsmith89
2
Wenn jemand auf Installationsprobleme mit conda stößt, versuchen Sie: pip install jupyter_contrib_nbextensionsdann jupyter contrib nbextensions install --sys-prefix --skip-running-check. Ich wünschte, Jupiter hätte dieses Paket standardmäßig.
user1700890
7
Der einfachste Installationspfad führt über conda selbst : conda install -c conda-forge jupyter_contrib_nbextensions.
Max Ghenis
3
Nur eine kurze Anmerkung für alle, die das neuere JupyterLab verwenden. Laut der erwähnten GitHub-Site funktionieren diese Erweiterungen in JupyterLab. Ich habe mich das selbst gefragt und dachte mir, ich würde es andere wissen lassen. Zitieren des GitHub-Repos : Due to major differences between the Jupyter Notebook and JupyterLab, the extensions in this repository will not work in JupyterLab.
NYCeyes
2
Sie können eine ganze Zelle reduzieren, wenn Sie ein # -Kommentar oben in die Zelle einfügen. Jupyter stellt dann einen Dropdown-Pfeil bereit, der die gesamte Zelle zusammenbricht.
EatSleepCode
27

Sie können eine Zelle erstellen und den folgenden Code einfügen:

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

Durch Ausführen dieser Zelle werden alle Eingabezellen ausgeblendet. Um sie wieder anzuzeigen, können Sie über das Menü alle Ausgaben löschen.

Andernfalls können Sie Notebook-Erweiterungen wie folgt ausprobieren:

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

Pan Yan
quelle
Die Notebook-Erweiterungen sind wirklich gut. Es gibt auch eine Reihe anderer Dinge. github.com/ipython-contrib/jupyter_contrib_nbextensions
shahensha
27

JupyterLab unterstützt das Zusammenfallen von Zellen. Durch Klicken auf die blaue Zellenleiste links wird die Zelle gefaltet. Geben Sie hier die Bildbeschreibung ein

Intsco
quelle
6
exportiert aber nicht weiter
cosmosa
Gibt es dafür eine gute Lösung? Ich möchte so sehr kollabierte Zellen beim Exportieren verstecken. Ich möchte einen Code und eine Ausgabe behalten und einen anderen Code und eine andere Ausgabe ausblenden, damit ich nicht einfach den gesamten Code ausblenden kann .....
Russell Richie
1
Der Code und die Ausgabe können wie in dieser Antwort beschrieben reduziert werden. Darüber hinaus bleiben die Informationen erhalten. Es wird in die Metadaten der Zelle geschrieben. source_hiddenund outputs_hiddenist eingestellt. nbformat.readthedocs.io/en/latest/…
gillesB
16

Ich hatte ein ähnliches Problem und die von @Energya hervorgehobenen "nbextensions" funktionierten sehr gut und mühelos. Die Installationsanweisungen für die Notebook-Erweiterungen und deren Konfigurator sind unkompliziert (ich habe es mit Anaconda unter Windows versucht) .

Trotzdem möchte ich hinzufügen, dass die folgenden Erweiterungen von Interesse sein sollten.

  • Eingabe ausblenden | Diese Erweiterung ermöglicht das Ausblenden einer einzelnen Codezelle in einem Notizbuch. Dies kann durch Klicken auf die Symbolleistenschaltfläche erreicht werden: Eingabe ausblenden

  • Zusammenklappbare Überschriften | Ermöglicht dem Notizbuch zusammenklappbare Abschnitte, die durch Überschriften getrennt sind Zusammenklappbare Überschriften

  • Codefaltung | Dies wurde erwähnt, aber ich füge es der Vollständigkeit halber hinzu Codefaltung

Atul Singh Arora
quelle
9

Erstellen Sie die Datei custom.js in ~ / .jupyter / custom / mit folgenden Inhalten:

$("<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');
    }
});

Starten Sie nach dem Speichern den Server neu und aktualisieren Sie das Notebook. Sie können jede Zelle reduzieren, indem Sie auf die Eingabebeschriftung (In []) klicken.

Sundar
quelle
3
Dies hat bei mir nicht funktioniert, da das zu ändernde div nicht geladen wird, wenn das benutzerdefinierte js ausgeführt wird. Dies kann jedoch behoben werden, indem alles in setTimeout (function () {...}, 3000) eingeschlossen wird.
Steohan
2
Dies funktionierte für mich, nachdem ich die 4. Zeile in: var c = $(event.target).closest('.cell.code_cell') geändert hatte und Steohans Vorschlag befolgt hatte, alles in setTimeout zu verpacken.
Proteom
Sie können einfach c.toggleClass verwenden ('Zusammenbruch'); anstelle der if-else-Anweisung.
Gouravkr
9

Mit der Erweiterung hide_code können Sie einzelne Zellen und / oder die Eingabeaufforderungen daneben ausblenden. Installieren als

pip3 install hide_code

Besuchen Sie https://github.com/kirbs-/hide_code/, um weitere Informationen zu dieser Erweiterung zu erhalten.

Linas
quelle
9

Befolgen Sie zunächst die Anweisungen von Energya:

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

Zweitens ist der Schlüssel: Klicken Sie nach dem Öffnen des Jupiter-Notizbuchs auf die Registerkarte Nbextension. Jetzt Suchen „colla“ aus dem Suchwerkzeug durch Nbextension (nicht von dem Web - Browser) , dann werden Sie etwas namens „zusammenklappbare Rubriken“ finden

Das ist, was du willst!

user40780
quelle
2

Wie andere bereits erwähnt haben, können Sie dies über nbextensions tun. Ich wollte kurz und einfach erklären, was ich getan habe:

So aktivieren Sie kollabierbare Überschriften: Aktivieren / installieren Sie in Ihrem Terminal Jupyter Notebook Extensions, indem Sie zuerst Folgendes eingeben:

pip install jupyter_contrib_nbextensions

Geben Sie dann Folgendes ein:

jupyter contrib nbextension install

Öffnen Sie das Jupyter-Notizbuch erneut. Gehen Sie zur Registerkarte "Bearbeiten" und wählen Sie "nbextensions config". Deaktivieren Sie das Kontrollkästchen direkt unter dem Titel "Konfigurierbare Erweiterungen" und wählen Sie "Reduzierbare Überschriften".

Mame Gannon-Luiz
quelle
Ich frage mich, warum man nicht nbextensions configdirekt vom Haupt-Dashboard aus zugreifen kann und stattdessen ein Notizbuch öffnen muss. Alternativ kann man, wie bereits erwähnt, über localhost:8888/nbextensions(oder den in Ihrer Konfiguration befindlichen Port) darauf zugreifen
Antoine
2

Es gibt viele Antworten auf diese Frage, die meiner Meinung nach nicht zufriedenstellend sind (einige mehr als andere), von den vielen Erweiterungen - Code-Faltung, Faltung nach Überschriften usw. usw. Keine macht das, was ich will, auf einfache und effektive Weise. Ich bin buchstäblich erstaunt, dass eine Lösung nicht implementiert wurde (wie bei Jupyter Lab).

Tatsächlich war ich so unzufrieden, dass ich eine sehr einfache Notebook-Erweiterung entwickelt habe, mit der der Code in einer Notebook-Zelle erweitert / reduziert werden kann, während er ausführbar bleibt.

Das GitHub-Repository: https://github.com/BenedictWilkinsAI/cellfolding

Unten finden Sie eine kleine Demo der Erweiterung:

Durch einfaches Doppelklicken links neben der Codezelle wird diese in eine einzelne Zeile reduziert:

Durch erneutes Doppelklicken wird die Zelle erweitert.

Die Erweiterung kann einfach mit pip installiert werden:

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

und ist auch mit dem nbextension-Konfigurator kompatibel . Ich hoffe, dass die Leute dies nützlich finden!

BenedictWilkinsAI
quelle
2
Lief wie am Schnürchen. Ordentlich
Ayan Mitra
1

Es gibt auch eine verbesserte Version des Pan Yan-Vorschlags. Es fügt die Schaltfläche hinzu, die Codezellen zurück zeigt:

%%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>

Oder 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>"""))
Peter Zagubisalo
quelle
2
Der Code verbirgt ALLE Eingabezellen, keine bestimmte Zelle.
Jack Fleeting
Genau das, was ich für die Ausgabe wollte, aber Sie können alle Ausgaben reduzieren / ausblenden, indem Sie sie im Jupyter-Menü
umschalten
Schade, dies ist die einzige Lösung, die ich gefunden habe und die den Code standardmäßig verbirgt und nur beim Klicken anzeigt. Leider verbirgt dies alle Zellen und nicht nur eine Zielzelle.
Penelope
@penelope Sie können überprüfen, ob verschiedene Zellen unterschiedliche HTML-Element-IDs oder eindeutige Klassen haben. Wenn ja, können Sie meine Antwort entsprechend ändern. Meine Antwort betrifft alle Zellen, da sie nicht zwischen Zellen unterscheidet.
Peter Zagubisalo
1

Sie müssen nur die Erweiterungen aktivieren:

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

Geben Sie hier die Bildbeschreibung ein

Am wahrscheinlichsten finden Sie alle Ihre Erweiterungen hier:

http://localhost:8888/nbextensions

Geben Sie hier die Bildbeschreibung ein

Prosti
quelle
1

Was ich benutze, um das gewünschte Ergebnis zu erzielen, ist:

  1. Speichern Sie den folgenden Codeblock in einer Datei mit dem Namen toggle_cell.pyim selben Verzeichnis wie Ihr Notebook
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. Fügen Sie in der ersten Zelle Ihres Notizbuchs Folgendes hinzu
from toggle_cell import toggle_code as hide_sloution
  1. Jede Zelle, die Sie zum einfachen Aufrufen der Umschalttaste benötigen hide_sloution()
ِ Abdalrahman M. Amer
quelle