Réduire la cellule dans le bloc-notes Jupyter

143

J'utilise le notebook ipython Jupyter. Disons que j'ai défini une fonction qui occupe beaucoup d'espace sur mon écran. Existe-t-il un moyen de réduire la cellule?

Je veux que la fonction reste exécutée et appelable, mais je veux masquer / réduire la cellule afin de mieux visualiser le cahier. Comment puis-je faire ceci?

aloha
la source
30
Wow, nous
sommes
31
2019 et
ça
23
2020 ... (premier!)
itzy
5
Ah, je vais mettre un rappel pour que je puisse être le premier en 2021
débutant le
6
JupyterLab l'a depuis 2019. Mettez en surbrillance une cellule, puis cliquez sur la barre bleue à côté. Vous le verrez maintenant représenté par trois points. Il sera respecté lorsque vous enregistrez et rouvrez plus tard ou ailleurs. Il existe d'autres fonctionnalités et options, telles que View> Collapse All Code, voir ici et le lien ici .
Wayne le

Réponses:

94

le jupyter contrib nbextensions package Python contient une extension de pliage de code qui peut être activée dans le bloc-notes. Suivez le lien (Github) pour la documentation.

Pour installer en utilisant la ligne de commande:

pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user

Pour faciliter leur gestion, je recommande également le jupyter nbextensions configurator package. Cela fournit un onglet supplémentaire dans l'interface de votre ordinateur portable à partir duquel vous pouvez facilement (dés) activer toutes les extensions installées.

Installation:

pip install jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable --user
Energya
la source
11
Cool stuff, même si je souhaite que la nbextension "Codefolding" plie des cellules entières, et pas seulement des blocs de code.
bsmith89
2
Si quelqu'un rencontre des problèmes d'installation avec conda, essayez: pip install jupyter_contrib_nbextensionsalors jupyter contrib nbextensions install --sys-prefix --skip-running-check. Je souhaite que jupyter ait ce paquet par défaut.
user1700890
7
Chemin d'installation est simple via Conda lui - même : conda install -c conda-forge jupyter_contrib_nbextensions.
Max Ghenis
3
Juste un petit mot pour tous ceux qui utilisent le nouveau JupyterLab. Selon le site GitHub mentionné, ces extensions fonctionnent dans JupyterLab. Je me suis posé cette question moi-même alors j'ai pensé que je ferais savoir aux autres. Citant le repo GitHub: Due to major differences between the Jupyter Notebook and JupyterLab, the extensions in this repository will not work in JupyterLab.
NYCeyes
2
Vous POUVEZ réduire une cellule entière si vous mettez un #commentaire en haut de la cellule. Jupyter fournit alors une flèche déroulante qui réduira toute la cellule.
EatSleepCode
29

JupyterLab prend en charge la réduction des cellules. Cliquer sur la barre de cellule bleue à gauche pliera la cellule. entrez la description de l'image ici

Intsco
la source
6
ne persiste pas à exporter cependant
cosmosa
Y a-t-il une bonne solution pour cela? Je veux tellement cacher les cellules réduites lorsque j'exporte. Je veux garder du code et une sortie, et cacher un autre code et une sortie, donc je ne peux pas simplement cacher tout le code .....
Russell Richie
2
Le code et la sortie peuvent être réduits comme décrit dans cette réponse. De plus, les informations sont conservées. Il est écrit dans les métadonnées de la cellule. source_hiddenet outputs_hiddenest réglé. nbformat.readthedocs.io/en/latest/…
gillesB
27

Vous pouvez créer une cellule et y mettre le code suivant:

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

L'exécution de cette cellule masquera toutes les cellules d'entrée. Pour les afficher, vous pouvez utiliser le menu pour effacer toutes les sorties.

Sinon, vous pouvez essayer les extensions de notebook comme ci-dessous:

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

Pan Yan
la source
Les extensions de notebook sont vraiment bonnes. Il y a aussi un tas d'autres choses. github.com/ipython-contrib/jupyter_contrib_nbextensions
shahensha
16

J'ai eu un problème similaire et les "nbextensions" signalées par @Energya fonctionnaient très bien et sans effort. Les instructions d'installation sont simples (j'ai essayé avec anaconda sous Windows) pour les extensions de notebook et pour leur configurateur .

Cela dit, je voudrais ajouter que les extensions suivantes devraient être intéressantes.

  • Masquer l'entrée | Cette extension permet de cacher un codecell individuel dans un notebook. Ceci peut être réalisé en cliquant sur le bouton de la barre d'outils: Masquer l'entrée

  • En-têtes réductibles | Permet au notebook d'avoir des sections réductibles, séparées par des en-têtes En-têtes réductibles

  • Codefolding | Cela a été mentionné mais je l'ajoute par souci d'exhaustivité Codefolding

Atul Singh Arora
la source
9

Créez un fichier custom.js dans ~ / .jupyter / custom / avec le contenu suivant:

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

Après l'enregistrement, redémarrez le serveur et actualisez le notebook. Vous pouvez réduire n'importe quelle cellule en cliquant sur l'étiquette d'entrée (Dans []).

Sundar
la source
3
Cela n'a pas fonctionné pour moi car le div à modifier n'est pas chargé, lorsque le js personnalisé est exécuté. Cependant, cela peut être corrigé en enveloppant tout dans setTimeout (function () {...}, 3000);
Steohan
2
Cela a fonctionné pour moi après avoir changé la 4ème ligne en: var c = $(event.target).closest('.cell.code_cell') et suite à la suggestion de Steohan de tout envelopper dans setTimeout.
proteome le
Vous pouvez simplement utiliser c.toggleClass ('collapse'); au lieu de l'instruction if-else.
gouravkr
9

L'extension hide_code vous permet de masquer des cellules individuelles et / ou les invites à côté d'elles. Installer en tant que

pip3 install hide_code

Visitez https://github.com/kirbs-/hide_code/ pour plus d'informations sur cette extension.

Linas
la source
9

Tout d'abord, suivez les instructions d'Energya:

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

La deuxième est la clé: après avoir ouvert le notebook Jupiter, cliquez sur l'onglet Nbextension. Maintenant, recherchez "colla" à partir de l'outil de recherche fourni par Nbextension (et non par le navigateur Web) , puis vous trouverez quelque chose appelé "En-têtes réductibles"

Voici ce que tu veux!

utilisateur40780
la source
2

Comme d'autres l'ont mentionné, vous pouvez le faire via nbextensions. Je voulais donner une brève explication de ce que j'ai fait, ce qui a été rapide et facile:

Pour activer les en-têtes réductibles: Dans votre terminal, activez / installez les extensions Jupyter Notebook en saisissant d'abord:

pip install jupyter_contrib_nbextensions

Ensuite, entrez:

jupyter contrib nbextension install

Rouvrez Jupyter Notebook. Allez dans l'onglet "Edition" et sélectionnez "nbextensions config". Décochez la case directement sous le titre "nbextensions configurables", puis sélectionnez "en-têtes réductibles".

Mame Gannon-Luiz
la source
Vous vous demandez pourquoi on ne peut pas accéder nbextensions configdirectement à partir du tableau de bord principal et doit ouvrir un ordinateur portable à la place. Alternativement, comme d'autres l'ont mentionné, on peut y accéder via localhost:8888/nbextensions(ou selon le port de votre configuration)
Antoine
2

Il y a beaucoup de réponses à cette question, qui ne me semblent pas satisfaisantes (certaines plus que d'autres), des nombreuses extensions - pliage de code, pliage par en-têtes, etc. Aucune ne fait ce que je veux de manière simple et efficace. Je suis littéralement étonné qu'une solution n'ait pas été mise en œuvre (comme pour Jupyter Lab).

En fait, j'étais tellement insatisfait que j'ai développé une extension de notebook très simple qui peut développer / réduire le code dans une cellule de notebook, tout en le gardant exécutable.

Le référentiel GitHub: https://github.com/BenedictWilkinsAI/cellfolding

Voici une petite démonstration de ce que fait l'extension:

Il suffit de double-cliquer à gauche de la cellule de code pour la réduire en une seule ligne:

Double-cliquez à nouveau pour agrandir la cellule.

L'extension peut être installée facilement avec pip:

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

et est également compatible avec le configurateur nbextension . J'espère que les gens trouveront cela utile!

BenedictWilkinsAI
la source
2
A travaillé comme un charme. Neat
Ayan Mitra
1

Il existe également une version améliorée de la suggestion Pan Yan. Il ajoute le bouton qui affiche les cellules de code:

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

Ou 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
la source
2
Les codes masquent TOUTES les cellules d'entrée, pas une cellule particulière.
Jack Fleeting
Exactement ce que je voulais pour la sortie, mais vous pouvez réduire / masquer toute la sortie en la basculant dans le menu Jupyter: Cell> All Output> Toggle
markling
Dommage, c'est la seule solution que j'ai trouvée qui masque le code par défaut et ne l'affiche qu'au clic. Malheureusement, cela masque toutes les cellules et pas seulement une cible.
penelope le
@penelope vous pouvez vérifier si différentes cellules ont des ID d'éléments html différents ou des classes uniques. Si oui, vous pouvez modifier ma réponse en conséquence. Ma réponse affecte toutes les cellules car elle ne différencie pas les cellules.
Peter Zagubisalo le
1

Vous n'avez pas besoin de faire grand chose sauf pour activer les extensions:

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

entrez la description de l'image ici

Très probablement, vous trouverez toutes vos extensions ici:

http://localhost:8888/nbextensions

entrez la description de l'image ici

prosti
la source
1

Ce que j'utilise pour obtenir le résultat souhaité est:

  1. Enregistrez le bloc de code ci-dessous dans un fichier nommé toggle_cell.pydans le même répertoire que celui de votre 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. Ajoutez ce qui suit dans la première cellule de votre bloc-notes
from toggle_cell import toggle_code as hide_sloution
  1. Toute cellule dont vous avez besoin pour ajouter le bouton bascule pour appeler simplement hide_sloution()
ِ Abdalrahman M. Amer
la source