webentwicklung-frage-antwort-db.com.de

Wie kann ich Code aus Zellen in einem mit nbviewer visualisierten ipython-Notizbuch ausblenden?

Ich habe ein ipython/jupyter-Notizbuch, das ich mit NBviewer visualisiere.

Wie kann ich den gesamten Code aus dem von NBviewer erstellten Notizbuch ausblenden, sodass nur die Ausgabe von Code (z. B. Grafiken und Tabellen) und die Markdown-Zellen angezeigt werden?

94
lucacerone
from IPython.display import HTML

HTML('''<script>
code_show=true; 
function code_toggle() {
 if (code_show){
 $('div.input').hide();
 } else {
 $('div.input').show();
 }
 code_show = !code_show
} 
$( document ).ready(code_toggle);
</script>
<form action="javascript:code_toggle()"><input type="submit" value="Click here to toggle on/off the raw code."></form>''')
161
harshil

Ich würde hide_input_all von nbextensions ( https://github.com/ipython-contrib/IPython-notebook-extensions ) verwenden. Hier ist wie:

  1. Finden Sie heraus, wo sich Ihr IPython-Verzeichnis befindet:

    from IPython.utils.path import get_ipython_dir
    print get_ipython_dir()
    
  2. Laden Sie nbextensions herunter und verschieben Sie es in das IPython-Verzeichnis.

  3. Bearbeiten Sie Ihre custom.js -Datei irgendwo im IPython-Verzeichnis (mein Befand sich in profile_default/static/custom), um dem custom.example) zu ähneln .js im Verzeichnis nbextensions.

  4. Fügen Sie diese Zeile zu custom.js hinzu:

    IPython.load_extensions('usability/hide_input_all')
    

IPython Notebook verfügt jetzt über eine Schaltfläche zum Umschalten von Codezellen, unabhängig von der Arbeitsmappe.

18
user394430

Die neueste Version des IPython-Notebooks erlaubt es nicht mehr, Javascript in Markdown-Zellen auszuführen, sodass das Hinzufügen einer neuen Markdown-Zelle mit dem folgenden JavaScript-Code die Codezellen nicht mehr verdeckt (siehe this link ).

Ändern Sie ~/.ipython/profile_default/static/custom/custom.js wie folgt:

code_show=true;
function code_toggle() {
 if (code_show){
 $('div.input').hide();
 } else {
 $('div.input').show();
 }
 code_show = !code_show
}

$([IPython.events]).on("app_initialized.NotebookApp", function () {
  $("#view_menu").append("<li id=\"toggle_toolbar\" title=\"Show/Hide code cells\"><a href=\"javascript:code_toggle()\">Toggle Code Cells</a></li>")
});
15
user4284784

Ich habe etwas Code geschrieben, der dies bewerkstelligt, und fügt eine Schaltfläche hinzu, um die Sichtbarkeit des Codes zu ändern.

In einer Codezelle oben in einem Notizbuch wird Folgendes angezeigt:

from IPython.display import display
from IPython.display import HTML
import IPython.core.display as di # Example: di.display_html('<h3>%s:</h3>' % str, raw=True)

# This line will hide code by default when the notebook is exported as HTML
di.display_html('<script>jQuery(function() {if (jQuery("body.notebook_app").length == 0) { jQuery(".input_area").toggle(); jQuery(".Prompt").toggle();}});</script>', raw=True)

# This line will add a button to toggle visibility of code blocks, for use with the HTML export version
di.display_html('''<button onclick="jQuery('.input_area').toggle(); jQuery('.Prompt').toggle();">Toggle code</button>''', raw=True)

Sie sehen ein Beispiel, wie das in NBviewer aussieht .

Update: Das Verhalten von Markdown-Zellen in Jupyter ist etwas komisch, funktioniert aber in der HTML-Exportversion des Notizbuchs einwandfrei.

8
Max Masnick

Dies ist jetzt direkt ab nbconvert ab Version 5.2.1 möglich: /: Der Inhalt kann mithilfe des integrierten template exporter ausgeschlossen werden . Zum Beispiel:

jupyter nbconvert --to pdf --TemplateExporter.exclude_input=True my_notebook.ipynb

schließt die "Eingabecode" -Zellen aus, dh den Code selbst. Ähnliche Optionen existieren, um Eingabeaufforderungen, Markdown-Zellen oder -Ausgänge oder sowohl Ein- als auch Ausgänge auszuschließen.

(Diese Optionen sollten unabhängig vom Ausgabeformat funktionieren.)

7
Noah

Es gibt eine Lösung von Nice hier , die für in HTML exportierte Notebooks gut funktioniert. Die Website verweist auch hier zurück zu diesem SO Beitrag, aber Chris 'Lösung ist hier nicht zu sehen! (Chris, wo bist du?) 

Dies ist im Grunde die gleiche Lösung wie die akzeptierte Antwort von harshil, hat jedoch den Vorteil, dass der Toggle-Code selbst im exportierten HTML-Code ausgeblendet wird. Ich mag es auch, dass dieser Ansatz die IPython-HTML-Funktion überflüssig macht. 

Fügen Sie der "Raw NBConvert" -Zelle oben in Ihrem Notizbuch den folgenden Code hinzu, um diese Lösung zu implementieren:

<script>
  function code_toggle() {
    if (code_shown){
      $('div.input').hide('500');
      $('#toggleButton').val('Show Code')
    } else {
      $('div.input').show('500');
      $('#toggleButton').val('Hide Code')
    }
    code_shown = !code_shown
  }

  $( document ).ready(function(){
    code_shown=false;
    $('div.input').hide()
  });
</script>
<form action="javascript:code_toggle()">
  <input type="submit" id="toggleButton" value="Show Code">
</form>

Dann einfach das Notizbuch nach HTML exportieren. Am oberen Rand des Notizbuchs befindet sich eine Umschaltfläche, um den Code ein- oder auszublenden. 

Chris gibt auch ein Beispiel hier .

Ich kann überprüfen, dass dies in Jupyter 5.0.0 funktioniert

Update: Es ist auch praktisch, die div.Prompt-Elemente zusammen mit den div.input-Elementen anzuzeigen/auszublenden. Dadurch wird der Text In [##]: und Out: [##] entfernt und die Ränder links reduziert.

6
Ken

Zur besseren Anzeige mit einem gedruckten Dokument oder einem Bericht müssen wir auch die Schaltfläche entfernen und bestimmte Codeblöcke anzeigen oder ausblenden. Ich verwende Folgendes (einfach kopieren und in die erste Zelle einfügen):

# This is a cell to hide code snippets from displaying
# This must be at first cell!

from IPython.display import HTML

hide_me = ''
HTML('''<script>
code_show=true; 
function code_toggle() {
  if (code_show) {
    $('div.input').each(function(id) {
      el = $(this).find('.cm-variable:first');
      if (id == 0 || el.text() == 'hide_me') {
        $(this).hide();
      }
    });
    $('div.output_Prompt').css('opacity', 0);
  } else {
    $('div.input').each(function(id) {
      $(this).show();
    });
    $('div.output_Prompt').css('opacity', 1);
  }
  code_show = !code_show
} 
$( document ).ready(code_toggle);
</script>
<form action="javascript:code_toggle()"><input style="opacity:0" type="submit" value="Click here to toggle on/off the raw code."></form>''')

Dann in deinen nächsten Zellen:

hide_me
print "this code will be hidden"

und

print "this code will be shown"
6
jaycode

Dadurch wird eine IPython-Notizbuchausgabe gerendert. Sie können jedoch den Eingabecode anzeigen. Sie können ein Notizbuch kopieren und diesen Code dann hinzufügen, wenn Sie ihn für jemanden freigeben möchten, der den Code nicht anzeigen muss. 

from IPython.display import HTML

HTML('''<script> $('div .input').hide()''')
3
Chase Wright

Verwenden Sie die Runtools, die das grundlegende iPython-Notizbuch erweitern:

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

3
Petr

Hier ist eine weitere von p3trus vorgeschlagene Lösung:

$([IPython.events]).on('notebook_loaded.Notebook', function(){
    IPython.toolbar.add_buttons_group([
        {
             'label'   : 'toggle input cells',
             'icon'    : 'icon-refresh', 
             'callback': function(){$('.input').slideToggle()}
        }
    ]);
});

Wie in p3trus : Beschrieben. "[It] fügt der ipython-Notizblock-Symbolleiste eine Schaltfläche hinzu, um die Eingabecodezelle ein-/auszublenden. Um sie verwenden zu können, müssen Sie die Datei custom.js im Ordner .ipython_<profile name>/static/custom/ ablegen , wobei das verwendete IPython-Profil ist. "

Meine eigenen Kommentare: Ich habe diese Lösung überprüft und funktioniert mit iPython 3.1.0.

1
akhmed

Die akzeptierte Lösung funktioniert auch in Julia Jupyter/IJulia mit den folgenden Modifikationen:

display("text/html", """<script>
code_show=true; 
function code_toggle() {
 if (code_show){
 \$("div.input").hide();
 } else {
 \$("div.input").show();
 }
 code_show = !code_show
} 
\$( document ).ready(code_toggle);
</script>
<form action="javascript:code_toggle()"><input type="submit" value="Click here to toggle on/off the raw code."></form>""")

anmerkung insbesondere:

  • verwenden Sie die display-Funktion
  • das $-Zeichen umgehen (sonst als Variable gesehen)
1
gozzilli

Dies kann mit einem IPython-Widget ToggleButton und etwas JavaScript durchgeführt werden. Der folgende Code sollte in eine Codezelle oben im Dokument eingefügt werden:

import ipywidgets as widgets
from IPython.display import display, HTML

javascript_functions = {False: "hide()", True: "show()"}
button_descriptions  = {False: "Show code", True: "Hide code"}


def toggle_code(state):

    """
    Toggles the JavaScript show()/hide() function on the div.input element.
    """

    output_string = "<script>$(\"div.input\").{}</script>"
    output_args   = (javascript_functions[state],)
    output        = output_string.format(*output_args)

    display(HTML(output))


def button_action(value):

    """
    Calls the toggle_code function and updates the button description.
    """

    state = value.new

    toggle_code(state)

    value.owner.description = button_descriptions[state]


state = False
toggle_code(state)

button = widgets.ToggleButton(state, description = button_descriptions[state])
button.observe(button_action, "value")

display(button)

Dadurch wird die folgende Schaltfläche erstellt, mit der der Code für das Jupyter Notebook ein- und ausgeblendet werden kann (standardmäßig "Ausblenden"):

 Hide code state

Wenn der Status "show" eingestellt ist, können Sie den Code für das Jupyter Notebook sehen:

 Show code state

Nebenbei gesagt, obwohl ein Großteil dieses Codes am Anfang des Notebooks stehen sollte, ist die Position der Umschaltfläche optional. Ich persönlich ziehe es vor, es am Ende des Dokuments zu belassen. Verschieben Sie dazu einfach die Zeile display(button) in eine separate Code-Zelle am unteren Rand der Seite:

 Relocated toggle button

1
Erick Shepherd

Mit all den oben genannten Lösungen, obwohl Sie den Code verstecken, erhalten Sie immer noch den [<matplotlib.lines.Line2D at 0x128514278>] - Mist über Ihrer Zahl, den Sie wahrscheinlich nicht wollen.

Wenn Sie die Eingabe tatsächlich entfernen möchten, anstatt sie nur auszublenden, ist es meiner Meinung nach die sauberste Lösung, Ihre Zahlen in versteckten Zellen zu speichern und dann die Bilder in Markdown-Zellen einzuschließen, indem Sie z. ![Caption](figure1.png).

0
maxymoo

(Papier) Drucken oder Speichern als HTML

Für diejenigen von Ihnen, die die Ausgaben auf Papier drucken möchten, scheinen die obigen Antworten allein keine schöne Endausgabe zu ergeben. Wenn Sie jedoch den Code von @Max Masnick verwenden und Folgendes hinzufügen, können Sie ihn auf einer vollständigen A4-Seite drucken.

from IPython.display import display
from IPython.display import HTML
import IPython.core.display as di

di.display_html('<script>jQuery(function() {if (jQuery("body.notebook_app").length == 0) { jQuery(".input_area").toggle(); jQuery(".Prompt").toggle();}});</script>', raw=True)

CSS = """#notebook div.output_subarea {max-width:100%;}""" #changes output_subarea width to 100% (from 100% - 14ex)
HTML('<style>{}</style>'.format(CSS))

Der Grund für den Einzug besteht darin, dass der von Max Masnick entfernte Prompt-Abschnitt bedeutet, dass sich bei der Ausgabe alles nach links verschiebt. Dies tat jedoch nichts für die maximale Breite der Ausgabe, die auf max-width:100%-14ex; beschränkt war. Dies ändert die maximale Breite des Ausgabebereichs in max-width:100%;.

0
josh

Konvertieren Sie die Zelle in Markdown und verwenden Sie das HTML5-Tag <details> wie im Beispiel von joyrexus:

https://Gist.github.com/joyrexus/16041f2426450e73f5df9391f7f7ae5f

## collapsible markdown?

<details><summary>CLICK ME</summary>
<p>

#### yes, even hidden code blocks!

```python
print("hello world!")
```

</p>
</details>
0
Valentas

Hier ist ein Nizza-Artikel (der gleiche @Ken-Beitrag), wie Jpuyter (das neue IPython) -Notizbuch für Präsentationen aufpoliert wird. Es gibt unzählige Möglichkeiten, Jupyter mit JS, HTML und CSS zu erweitern, einschließlich der Möglichkeit, mit dem Python-Kernel des Notebooks über Javascript zu kommunizieren. Es gibt magische Dekorateure für %%HTML und %%javascript, so dass Sie in einer Zelle selbst so etwas tun können:

%%HTML
<script>
  function code_toggle() {
    if (code_shown){
      $('div.input').hide('500');
      $('#toggleButton').val('Show Code')
    } else {
      $('div.input').show('500');
      $('#toggleButton').val('Hide Code')
    }
    code_shown = !code_shown
  }

  $( document ).ready(function(){
    code_shown=false;
    $('div.input').hide()
  });
</script>
<form action="javascript:code_toggle()"><input type="submit" id="toggleButton" value="Show Code"></form>

Ich kann auch bestätigen, dass Chris 'Methoden in Jupyter 4.X.X funktionieren.

0
ThisGuyCantEven