colapso celular en el cuaderno jupyter

143

Estoy usando el cuaderno ipython Jupyter. Digamos que definí una función que ocupa mucho espacio en mi pantalla. ¿Hay alguna manera de colapsar la célula?

Quiero que la función permanezca ejecutada y ejecutable, pero quiero ocultar / colapsar la celda para visualizar mejor el cuaderno. ¿Cómo puedo hacer esto?

aloha
fuente
30
Wow, ya es 2017 y no hay una solución simple
user1700890
31
2019 y sigue contando
Hardian Lawi
23
2020 ... (¡primero!)
itzy
55
Ah, pondré un recordatorio para que pueda ser el primero en 2021
novato
66
JupyterLab tiene esto desde 2019. Resalta una celda y luego haz clic en la barra azul al lado. Lo verás representado como tres puntos ahora. Se respetará cuando guarde y vuelva a abrir más tarde o en otro lugar. Hay más funciones y opciones, como View> Collapse All Code, ver aquí y el enlace aquí .
Wayne

Respuestas:

94

El jupyter contrib nbextensionspaquete Python contiene una extensión de plegado de código que se puede habilitar dentro del cuaderno. Siga el enlace (Github) para la documentación.

Para instalar usando la línea de comando:

pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user

Para facilitarles la tarea de administrarlos, también recomendaría el jupyter nbextensions configuratorpaquete. Esto proporciona una pestaña adicional en la interfaz de su Notebook desde donde puede (des) activar fácilmente todas las extensiones instaladas.

Instalación:

pip install jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable --user
Energya
fuente
11
Cosas interesantes, aunque desearía que la nbextensión de "Codefolding" plegara celdas enteras, y no solo bloques de código.
bsmith89
2
Si alguien tiene problemas de instalación con conda intente: pip install jupyter_contrib_nbextensionsentonces jupyter contrib nbextensions install --sys-prefix --skip-running-check. Desearía que jupyter tuviera este paquete por defecto.
user1700890
77
Más simple ruta de instalación es a través de Conda sí : conda install -c conda-forge jupyter_contrib_nbextensions.
Max Ghenis
3
Solo una nota rápida para cualquiera que use el nuevo JupyterLab. Según el sitio mencionado de GitHub, estas extensiones funcionan en JupyterLab. Me lo pregunté, así que pensé en avisar a los demás. Citando el repositorio GitHub: Due to major differences between the Jupyter Notebook and JupyterLab, the extensions in this repository will not work in JupyterLab.
NYCeyes
2
PUEDE colapsar una celda completa si coloca un # comentario en la parte superior de la celda. Jupyter luego proporciona una flecha desplegable que colapsará toda la celda.
EatSleepCode
29

JupyterLab admite el colapso celular. Al hacer clic en la barra de celda azul a la izquierda, se plegará la celda. ingrese la descripción de la imagen aquí

intsco
fuente
66
sin embargo, no persiste en la exportación
cosmosa
¿Hay una buena solución para esto? Tengo muchas ganas de ocultar las células colapsadas cuando exporto. Quiero mantener algo de código y algo de salida, y ocultar algún otro código y salida, así que no puedo ocultar todo el código .....
Russell Richie
2
El código y la salida se pueden contraer como se describe en esta respuesta. Además, la información es persistente. Está escrito en los metadatos de la célula. source_hiddeny outputs_hiddenestá listo nbformat.readthedocs.io/en/latest/…
gillesB
27

Puede crear una celda y poner el siguiente código en ella:

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

La ejecución de esta celda ocultará todas las celdas de entrada. Para mostrarlos de nuevo, puede usar el menú para borrar todas las salidas.

De lo contrario, puede probar las extensiones de notebook como a continuación:

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

Pan Yan
fuente
Las extensiones de portátiles son realmente buenas. También hay muchas otras cosas. github.com/ipython-contrib/jupyter_contrib_nbextensions
shahensha
16

Tuve un problema similar y las "nbextensions" señaladas por @Energya funcionaron muy bien y sin esfuerzo. Las instrucciones de instalación son sencillas (probé con anaconda en Windows) para las extensiones del portátil y para su configurador .

Dicho esto, me gustaría agregar que las siguientes extensiones deberían ser de interés.

  • Ocultar entrada | Esta extensión permite ocultar una celda de código individual en un cuaderno. Esto se puede lograr haciendo clic en el botón de la barra de herramientas: Ocultar entrada

  • Encabezados plegables | Permite que la computadora portátil tenga secciones plegables, separadas por encabezados Encabezados Plegables

  • Codefolding | Esto ha sido mencionado pero lo agrego para completar Codefolding

Atul Singh Arora
fuente
9

Cree un archivo custom.js dentro de ~ / .jupyter / custom / con los siguientes contenidos:

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

Después de guardar, reinicie el servidor y actualice la notebook. Puede contraer cualquier celda haciendo clic en la etiqueta de entrada (En []).

Sundar
fuente
3
Esto no funcionó para mí, ya que el div que se va a cambiar no se carga cuando se ejecuta el js personalizado. Sin embargo, esto se puede arreglar envolviendo todo en setTimeout (function () {...}, 3000);
Steohan
2
Esto funcionó para mí después de cambiar la cuarta línea a: var c = $(event.target).closest('.cell.code_cell') y siguiendo la sugerencia de Steohan de envolver todo en setTimeout.
proteoma
Simplemente puede usar c.toggleClass ('colapso'); en lugar de la declaración if-else.
gouravkr
9

La extensión hide_code le permite ocultar celdas individuales y / o las indicaciones junto a ellas. Instalar como

pip3 install hide_code

Visite https://github.com/kirbs-/hide_code/ para obtener más información sobre esta extensión.

Linas
fuente
9

En primer lugar, siga las instrucciones de Energya:

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

La segunda es la clave: después de abrir el cuaderno de Júpiter, haga clic en la pestaña Nbextension. Ahora busque "colla" en la herramienta de búsqueda proporcionada por Nbextension (no por el navegador web) , luego encontrará algo llamado "Encabezados plegables"

¡Esto es lo que quieres!

usuario40780
fuente
2

Como otros han mencionado, puede hacerlo a través de nbextensions. Quería dar una breve explicación de lo que hice, que fue rápido y fácil:

Para habilitar encabezados compatibles: en su terminal, habilite / instale Extensiones de notebook Jupyter ingresando primero:

pip install jupyter_contrib_nbextensions

Luego, ingrese:

jupyter contrib nbextension install

Vuelva a abrir el cuaderno Jupyter. Vaya a la pestaña "Editar" y seleccione "nbextensions config". Desmarque la casilla directamente debajo del título "Extensiones n configurables", luego seleccione "encabezados plegables".

Mame Gannon-Luiz
fuente
Preguntándose por qué uno no puede acceder nbextensions configdirectamente desde el tablero principal y en su lugar tiene que abrir un cuaderno. Alternativamente, como otros han mencionado, uno puede acceder a través de localhost:8888/nbextensions(o cualquier puerto que esté en su configuración)
Antoine
2

Hay muchas respuestas a esta pregunta, todas las cuales creo que no son satisfactorias (algunas más que otras), de las muchas extensiones: plegado de códigos, plegado por encabezados, etc. Ninguno hace lo que quiero de manera simple y efectiva. Estoy literalmente sorprendido de que no se haya implementado una solución (como lo ha hecho para Jupyter Lab).

De hecho, estaba tan insatisfecho que desarrollé una extensión de cuaderno muy simple que puede expandir / colapsar el código en una celda del cuaderno, mientras lo mantengo ejecutable.

El repositorio de GitHub: https://github.com/BenedictWilkinsAI/cellfolding

A continuación se muestra una pequeña demostración de lo que hace la extensión:

Simplemente haciendo doble clic a la izquierda de la celda de código la contraerá en una sola línea:

Hacer doble clic nuevamente expandirá la celda.

La extensión se puede instalar fácilmente con pip:

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

y también es compatible con nbextension configurator . ¡Espero que la gente lo encuentre útil!

BenedictWilkinsAI
fuente
2
Trabajado como un encanto. Aseado
Ayan Mitra
1

También hay una versión mejorada de la sugerencia de Pan Yan. Agrega el botón que muestra las celdas de código:

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

O pitón:

# 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
fuente
2
Los códigos ocultan TODAS las celdas de entrada, no una celda en particular.
Jack fugaz
Justo lo que quería para la salida, pero puede contraer / ocultar toda la salida al alternarla en el menú Jupyter: Celda> Todas las salidas> Alternar
marcar
Es una pena, esta es la única solución que encontré que oculta el código de forma predeterminada y solo lo muestra al hacer clic. Desafortunadamente, esto oculta todas las celdas y no solo una.
Penélope
@penelope puede verificar si diferentes celdas tienen diferentes ID de elementos html o clases únicas. En caso afirmativo, puede modificar mi respuesta en consecuencia. Mi respuesta afecta a todas las celdas porque no diferencia entre celdas.
Peter Zagubisalo
1

No necesita hacer mucho, excepto para habilitar las extensiones:

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

ingrese la descripción de la imagen aquí

Lo más probable es que encuentre todas sus extensiones aquí:

http://localhost:8888/nbextensions

ingrese la descripción de la imagen aquí

prosti
fuente
1

Lo que uso para obtener el resultado deseado es:

  1. Guarde el siguiente bloque de código en un archivo nombrado toggle_cell.pyen el mismo directorio que el de su computadora portátil
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. Agregue lo siguiente en la primera celda de su cuaderno
from toggle_cell import toggle_code as hide_sloution
  1. Cualquier celda que necesite agregar el botón de alternar para simplemente llamar hide_sloution()
ِ Abdalrahman M. Amer
fuente