web-dev-qa-db-fra.com

Comment masquer le code des cellules dans ipython notebook visualisé avec nbviewer?

J'ai un bloc-notes ipython/jupyter que je visualise à l'aide de NBviewer.

Comment puis-je masquer tout le code du cahier rendu par NBviewer, afin que seules la sortie du code (par exemple, des graphiques et des tableaux) et les cellules de démarque soient affichées?

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

Je voudrais utiliser hide_input_all de nbextensions ( https://github.com/ipython-contrib/IPython-notebook-extensions ). Voici comment:

  1. Découvrez où se trouve votre répertoire IPython:

    from IPython.utils.path import get_ipython_dir
    print get_ipython_dir()
    
  2. Téléchargez nbextensions et déplacez-le dans le répertoire IPython.

  3. Editez votre fichier custom.js quelque part dans le répertoire IPython (le mien Était dans profile_default/static/custom) pour être similaire au custom.example .js dans le répertoire nbextensions.

  4. Ajoutez cette ligne à custom.js:

    IPython.load_extensions('usability/hide_input_all')
    

IPython Notebook aura désormais un bouton pour basculer les cellules de code, quel que soit le classeur.

18
user394430

La dernière version du bloc-notes IPython n'autorisant plus l'exécution de javascript dans les cellules de démarques, l'ajout d'une nouvelle cellule de démarques avec le code javascript suivant ne fonctionnera plus pour masquer vos cellules de code (voir ce lien )

Modifiez ~/.ipython/profile_default/static/custom/custom.js comme suit:

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

J'ai écrit du code qui accomplit cela et a ajouté un bouton pour basculer la visibilité du code.

Ce qui suit va dans une cellule de code en haut d'un cahier:

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)

Vous pouvez voir un exemple de ce à quoi cela ressemble dans NBviewer ici .

Update: Cela aura un comportement amusant avec les cellules de Markdown dans Jupyter, mais cela fonctionne correctement dans la version d'exportation HTML du cahier.

8
Max Masnick

Cela est maintenant possible directement depuis nbconvert à partir de la version 5.2.1 : le contenu peut être filtré à l'aide des options d'exclusion intégrées template export . Par exemple:

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

exclura les cellules de "code d'entrée", c'est-à-dire le code lui-même. Des options similaires existent pour exclure les invites, les cellules de démarques, ou les sorties, ou les deux entrées et sorties.

(Ces options devraient fonctionner quel que soit le format de sortie.)

7
Noah

Il existe une solution intéressante fournie ici qui fonctionne bien pour les ordinateurs portables exportés au format HTML. Le site Web renvoie même ici au SO post, mais je ne vois pas la solution de Chris ici! (Chris, où es-tu?) 

C'est en gros la même solution que la réponse acceptée de harshil, mais elle présente l'avantage de cacher le code de bascule lui-même dans le code HTML exporté. J'aime aussi le fait que cette approche évite d'avoir à utiliser la fonction HTML IPython. 

Pour implémenter cette solution, ajoutez le code suivant à une cellule 'Raw NBConvert' en haut de votre ordinateur portable:

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

Ensuite, exportez simplement le bloc-notes au format HTML. Un bouton bascule en haut du cahier affichera ou masquera le code. 

Chris fournit également un exemple ici .

Je peux vérifier que cela fonctionne dans Jupyter 5.0.0

Update: Il est également pratique d'afficher/masquer les éléments div.Prompt avec les éléments div.input. Cela supprime les textes In [##]: et Out: [##] et réduit les marges à gauche.

6
Ken

Pour un meilleur affichage avec un document imprimé ou un rapport, nous devons également supprimer le bouton et pouvoir afficher ou masquer certains blocs de code. Voici ce que j'utilise (copiez-le simplement dans votre première cellule):

# 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>''')

Puis dans vos prochaines cellules:

hide_me
print "this code will be hidden"

et

print "this code will be shown"
6
jaycode

Cela rendra une sortie du cahier IPython. Cependant, vous noterez pouvoir visualiser le code saisi. Vous pouvez copier un cahier, puis ajouter ce code si nécessaire pour le partager avec quelqu'un qui n'a pas besoin de l'afficher. 

from IPython.display import HTML

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

Utilisez les outils Runtools qui étendent le bloc-notes de base iPython:

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

3
Petr

Voici une autre solution suggérée par p3trus :

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

Comme décrit dans p3trus : "[It] ajoute un bouton à la barre d’outils du bloc-notes ipython pour afficher/masquer la cellule de code de saisie. Pour l’utiliser, vous devez placer le fichier custom.js dans votre dossier .ipython_<profile name>/static/custom/ , où est le profil ipython utilisé. "

Mes propres commentaires: j'ai vérifié cette solution et cela fonctionne avec iPython 3.1.0.

1
akhmed

La solution acceptée fonctionne également à Julia Jupyter/IJulia avec les modifications suivantes:

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>""")

notez en particulier:

  • utiliser la fonction display
  • échappe au signe $ (sinon vu comme une variable)
1
gozzilli

Cela peut être fait en utilisant un widget IPython ToggleButton et un peu de JavaScript. Le code suivant doit être placé dans une cellule de code en haut du document:

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)

Cela crée le bouton suivant pour afficher/masquer le code du bloc-notes Jupyter, par défaut à l'état "masquer":

 Hide code state

Lorsqu'il est défini sur "show", vous pouvez voir le code du Jupyter Notebook:

 Show code state

En passant, même si une grande partie de ce code doit être placé au début du Bloc-notes, l'emplacement du bouton bascule est facultatif. Personnellement, je préfère le garder au bas du document. Pour ce faire, déplacez simplement la ligne display(button) dans une cellule de code distincte au bas de la page:

 Relocated toggle button

1
Erick Shepherd

Avec toutes les solutions ci-dessus, même si vous cachez le code, vous aurez toujours la merde [<matplotlib.lines.Line2D at 0x128514278>] au-dessus de votre silhouette, ce que vous ne voudrez probablement pas.

Si vous voulez réellement vous débarrasser de l'entrée plutôt que de la cacher, je pense la solution la plus propre consiste à enregistrer vos figures sur le disque dans des cellules cachées, puis d’inclure simplement les images dans les cellules de Markdown en utilisant, par exemple, des images. ![Caption](figure1.png)

0
maxymoo

(Papier) Impression ou enregistrement au format HTML

Pour ceux d’entre vous qui souhaitent imprimer sur papier les sorties, les réponses ci-dessus ne semblent pas donner une sortie finale de Nice. Cependant, le code de @Max Masnick ajouté en ajoutant ce qui suit permet de l’imprimer sur une page A4 complète.

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

La raison de l'indentation est que la section Invite supprimée par Max Masnick signifie que tout se décale vers la gauche en sortie. Cela n'a toutefois rien fait pour la largeur maximale de la sortie qui était limitée à max-width:100%-14ex;. Cela modifie la largeur maximale de la sortie_subarea en max-width:100%;.

0
josh

Convertissez une cellule en Markdown et utilisez la balise HTML5 <details> comme dans l'exemple de 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

Ici est un bel article (le même @Ken posté) sur la façon de peaufiner les cahiers Jpuyter (le nouvel IPython) à des fins de présentation. Il existe d'innombrables façons d'étendre Jupyter à l'aide de JS, HTML et CSS, y compris la possibilité de communiquer avec le noyau python de l'ordinateur portable à partir de javascript. Il y a des décorateurs magiques pour %%HTML et %%javascript afin que vous puissiez faire quelque chose comme ceci dans une cellule à part:

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

Je peux aussi garantir que les méthodes de Chris fonctionnent dans jupyter 4.X.X.

0
ThisGuyCantEven