在jupyter笔记本中折叠单元格


143

我正在使用ipython Jupyter笔记本。假设我定义了一个在屏幕上占用很多空间的函数。有没有办法让牢房塌陷?

我希望函数保持执行和可调用状态,但是我想隐藏/折叠单元格以便更好地可视化笔记本。我怎样才能做到这一点?


30
哇,已经是2017年了,没有简单的解决方案
user1700890

31
2019年仍在计数
Hardian Lawi

23
2020年……(第一次!)
itzy

5
啊,我会提醒您,让我成为2021
新手

6
JupyterLab自2019年以来就拥有此功能。突出显示一个单元格,然后单击它旁边的蓝色条。您现在将看到它表示为三个点。保存并在以后或其他地方重新打开时,它将受到尊重。还有其他功能和选项,例如View> Collapse All Code,请参见此处此处的链接
韦恩

Answers:


94

jupyter contrib nbextensionsPython包包含一个代码折叠扩展,可以在笔记本内启用。请点击链接(Github)获得文档。

要使用命令行安装:

pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user

为了使生活变得更轻松,我还建议您jupyter nbextensions configurator打包。这在笔记本电脑界面中提供了一个额外的选项卡,您可以在其中轻松地(停用)所有已安装的扩展程序。

安装:

pip install jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable --user

11
很酷的东西,尽管我希望“ Codefolding” nbextension可以折叠整个单元,而不仅仅是代码块。
bsmith89

2
如果有人遇到conda的安装问题,请尝试:pip install jupyter_contrib_nbextensions然后jupyter contrib nbextensions install --sys-prefix --skip-running-check。我希望jupyter在默认情况下有此软件包。
user1700890

7
最简单的安装途径是通过conda本身conda install -c conda-forge jupyter_contrib_nbextensions
Max Ghenis

3
对于使用新型JupyterLab的任何人来说,这只是一个简短的说明。根据提到的GitHub网站,这些扩展可以在JupyterLab中使用。我自己对此感到纳闷,所以我想让别人知道。引用GitHub存储库:Due to major differences between the Jupyter Notebook and JupyterLab, the extensions in this repository will not work in JupyterLab
NYCeyes

2
如果在单元格顶部放置#comment,则可以折叠整个单元格。然后,Jupyter提供一个下拉箭头,该箭头将折叠整个单元格。
EatSleepCode


27

JupyterLab支持细胞折叠。单击左侧的蓝色单元格栏将折叠该单元格。 在此处输入图片说明


6
虽然并没有坚持出口
cosmosa

有一个好的解决方案吗?我非常想在导出时隐藏折叠的单元格。我想保留一些代码和一些输出,并隐藏一些其他代码和输出,所以我不能只隐藏所有代码..
拉塞尔·里奇

2
如本答案所述,代码和输出可以折叠。此外,该信息得以保留。它写在单元的元数据中。source_hiddenoutputs_hidden设置。nbformat.readthedocs.io/en/latest/...
gillesB

16

我遇到了类似的问题,@ Energya指出的“ nbextensions”工作得非常好,很轻松。对于笔记本扩展及其配置程序,安装说明很简单(我在Windows上使用anaconda进行了尝试)。

就是说,我想补充一点,以下扩展应该引起关注。

  • 隐藏输入| 此扩展允许在笔记本中隐藏单个码元。这可以通过单击工具栏按钮来实现: 隐藏输入

  • 可折叠的标题| 允许笔记本具有可折叠的部分,并以标题分隔 可折叠的标题

  • 代码折叠| 已经提到过,但是为了完整性我添加了它 代码折叠


9

在〜/ .jupyter / custom /内创建具有以下内容的custom.js文件:

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

保存后,重新启动服务器并刷新笔记本。您可以通过单击输入标签(In [])折叠任何单元格。


3
这对我不起作用,因为在执行自定义js时未加载要更改的div。但是,可以固定将所有内容包装在setTimeout(function(){...},3000);中。
Steohan '16

2
在将第四行更改为:var c = $(event.target).closest('.cell.code_cell') 并遵循Steohan的建议将所有内容包装在setTimeout中之后,这对我 有用。
蛋白质组

您可以简单地使用c.toggleClass('collapse'); 而不是if-else语句。
gouravkr


9

首先,按照Energya的指示进行:

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

第二个关键是:打开木星笔记本后,单击Nbextension选项卡。现在,从Nbextension提供的搜索工具(不是Web浏览器)中搜索“ colla”,然后您将找到一个名为“ Collapsible Headings”的内容

这就是你想要的!


2

正如其他人所提到的,您可以通过nbextensions进行此操作。我想简短地解释一下我所做的事情:

要启用可协作的标题:在终端中,首先输入以下内容来启用/安装Jupyter Notebook Extensions:

pip install jupyter_contrib_nbextensions

然后输入:

jupyter contrib nbextension install

重新打开Jupyter Notebook。转到“编辑”选项卡,然后选择“ nbextensions配置”。取消直接在标题“ Configurable nbextensions”下的复选框,然后选择“可折叠标题”。


想知道为什么不能nbextensions config直接从主仪表板访问而必须打开笔记本。或者,正如其他人所提到的,我们可以通过访问它localhost:8888/nbextensions(或任何端口在您的配置)
安托万

2

这个问题有很多答案,在许多扩展中,我觉得所有这些都不令人满意(有些比其他更好),例如代码折叠,标题折叠等。没有一个人以简单有效的方式满足我的要求。令我惊讶的是,尚未实施解决方案(对于Jupyter Lab而言)。

实际上,我非常不满意,以至于我开发了一个非常简单的笔记本扩展,可以扩展/折叠笔记本单元中的代码,同时保持其可执行性。

GitHub存储库:https : //github.com/BenedictWilkinsAI/cellfolding

以下是该扩展程序的小演示:

只需双击代码单元的左侧,即可将其折叠为一行:

再次双击将展开该单元格。

该扩展可以通过pip轻松安装:

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

并且还与nbextension configurator兼容。我希望人们会发现这很有用!


2
像魅力一样工作。整洁
Ayan Mitra

1

潘岩建议的改进版本。它添加了显示代码单元的按钮:

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

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

2
代码隐藏所有输入单元格,而不是特定单元格。
杰克·弗莱汀

正是我想要的输出,但是您可以通过在Jupyter菜单中切换输出来折叠/隐藏所有输出:单元>所有输出>切换

不好意思,这是我发现的唯一解决方案,它默认情况下隐藏代码并仅在单击时显示它。不幸的是,这隐藏了所有单元,而不仅仅是一个目标单元。
penelope

@penelope,您可以检查不同的单元格是否具有不同的html元素ID或唯一类。如果是,那么您可以相应地修改我的答案。我的答案会影响所有细胞,因为它无法区分细胞。
Peter Zagubisalo

1

除了启用扩展,您不需要做太多事情:

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

在此处输入图片说明

最有可能在以下位置找到所有扩展:

http://localhost:8888/nbextensions

在此处输入图片说明


1

我用来获得预期结果的是:

  1. 将以下代码块保存toggle_cell.py在与笔记本相同目录中的文件中
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. 在笔记本的第一个单元格中添加以下内容
from toggle_cell import toggle_code as hide_sloution
  1. 您需要添加切换按钮即可调用的任何单元格 hide_sloution()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.