如何从用nbviewer可视化的ipython Notebook中的单元格中隐藏代码?


147

我有一个使用NBviewer可视化的ipython / jupyter笔记本。

如何隐藏NBviewer渲染的笔记本中的所有代码,以便仅显示代码输出(例如,图和表格)和降价单元格?


10
默认用户界面(2016年2月)中仍然没有此按钮。恕我直言,这真的很烦人。这是将要实现的功能列表:github.com/jupyter/notebook/issues/534 太好了。我很期待。
随机

1
请在下面查看“诺亚”答案。通过包含TemplateExporter,可以独立于输出格式解决此问题。在撰写本文时,Noah的答案取代了刺耳的答案(这是TemplateExporter的一个很好的解决方案)。
MichaelA

Answers:


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

5
如果我将其放在代码单元中,则可以在iPython 3.1.0上为我工作。我将其替换为<form action ... > ... </form>简单的HTML,例如The raw code for this IPython notebook is by default hidden for easier reading.To toggle on/off the raw code, click <a href="javascript:code_toggle()">here</a>.
akhmed

谢谢您的回答!如果您需要隐藏按钮以及隐藏或显示某些代码块(如Rstudio)的功能,请参阅我的回答。
2015年

3
谢谢,这也可以并保存为html。建议将其放置在笔记本顶部的自己的单元格中。
Vivek Gani

如果将属性accesskey =“ h”添加到输入元素,则可以使用alt-h(至少在chrome中)进行显示隐藏
frankc 16-10-19

7
您将如何更改它,使其甚至不显示按钮,而只是隐藏代码?
哈雷库恩'17

79

5.2.1版开始,现在可以直接从nbconvert进行此操作:可以使用内置模板导出器的exclude选项过滤内容。例如:

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

将排除“输入代码”单元格,即代码本身。存在类似的选项以排除提示,降价单元格或输出,或排除输入和输出。

(这些选项应该与输出格式无关。)


3
这是最好的答案
skurp

默认情况下,.pdf导出保存在哪里?
MyopicVisage

与.ipython笔记本相同的文件夹。使用参数'--output NotebookNoCode'重命名该文件。
MyopicVisage

这应该在笔记本中运行吗?
lcrmorin

@were_cat不,这是用于导出.ipynb笔记本文件的shell命令;在此示例中,将其转换为pdf
Noah,

19

hide_input_all将从nbextensionshttps://github.com/ipython-contrib/IPython-notebook-extensions)使用。这是如何做:

  1. 找出您的IPython目录在哪里:

    from IPython.utils.path import get_ipython_dir
    print get_ipython_dir()
  2. 下载nbextensions并将其移至IPython目录。

  3. 编辑您的custom.js在IPython的目录文件的地方(我是profile_default /静态/自定义),以类似于 custom.example.jsnbextensions目录。

  4. 将此行添加到custom.js

    IPython.load_extensions('usability/hide_input_all')

无论工作簿如何,IPython Notebook现在都将具有一个用于切换代码单元的按钮。


6
刚刚尝试过-尽管在将笔记本保存为html(即渲染到nbviewer)时仍会显示代码单元,但这似乎有助于在编辑笔记本时隐藏代码单元。
Vivek Gani

@VivekGani请注意,您可以使用同一
仓库中

15

最新的IPython Notebook版本不再允许在markdown单元中执行javascript,因此,使用以下javascript代码添加新的markdown单元将无法再隐藏您的代码单元(请参阅此链接

如下更改〜/ .ipython / profile_default / static / custom / custom.js:

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

正是我想要的!
lucky1928

奇怪的是,该解决方案对我不起作用,因为iPython视图菜单保持不变。(iPython 3.1.0)您的解决方案激发了我进一步的视野,并找到了一个非常相似的p3trus解决方案,它添加了一个按钮而不是一个菜单,并且确实起作用了。
akhmed 2015年

1
@akhmed也许您可以参考stackoverflow.com/a/29851084/1914781。这是一个不同的问题,但对您有帮助!

12

我编写了一些代码来完成此任务,并添加了一个按钮来切换代码的​​可见性。

笔记本顶部的代码单元中包含以下内容:

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)

您可以在NBviewer中看到一个示例

更新: Jupyter中的Markdown单元格将具有一些有趣的行为,但是在笔记本的HTML导出版本中可以正常工作。


3
这适用于代码单元,但是如果您有降价单元,它会做一些奇怪的事情。它将markdown显示为markdown,然后在下面显示相同的内容,但格式相同。
Scott H

我刚刚发现,唯一的错误是节点规范。代替'.input_area''.prompt'使用'div.input',它就像一个魅力!因此,要回顾一下,替代品jQuery("div.input").toggle();代替jQuery('.input_area').toggle(); jQuery('.prompt').toggle();。@Max Masnick,您能解决您的问题吗?
Scott H

只要您不与降价单元格交互,就可以使用“ div.input”作为节点选择,但是我只是发现,如果您与降价单元格进行交互,则可能会出现一些时髦的行为。例如,如果您双击一个markdown单元格,那么它将被完全隐藏。因此,按原样,我对Max解决方案的调整适合生成HTML以与他人共享,但不适用于随后与其进行过多交互。
Scott H

是的,所以我注意到您对Markdown单元所做的同样操作,使所有单元都被抬起。它可以在HTML导出中正常工作,这是我使用的地方。我将编辑答案以注意这一点。
Max Masnick

1
要从“ .prompt”的删除中删除剩余的空格,只需将此代码添加到上述代码的末尾。 CSS = """#notebook div.output_subarea { max-width:100%;""" HTML('<style>{}</style>'.format(CSS))。这对于打印非常有用。
小鲍比桌

9

这里提供一个很好的解决方案,该解决方案 非常适合导出到HTML的笔记本。该网站甚至链接回此SO帖子,但我在这里看不到Chris的解决方案!(克里斯,你在哪里?)

基本上,此方法与从名单上接受的苛刻答案是相同的解决方案,但是它具有将切换代码本身隐藏在导出的HTML中的优点。我也喜欢这种方法,避免了使用IPython HTML函数的需要。

要实现此解决方案,请将以下代码添加到笔记本顶部的“原始NBConvert”单元中:

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

然后只需将笔记本导出为HTML。笔记本顶部将有一个切换按钮,以显示或隐藏代码。

克里斯在这里也提供了一个例子。

我可以验证它在Jupyter 5.0.0中是否有效

更新:还可以方便地显示/隐藏div.prompt元素以及div.input元素。这将删除In [##]:Out: [##]文本,并减少左侧的边距。


单击此按钮是否可以使用此代码有选择地隐藏输出?IE $('div.output').next().hide('500');隐藏下一个输出?我已经尝试过自己,但无法正常工作。
Brian Keith

9

可以使用IPython ToggleButton小部件和少量JavaScript来完成。以下代码应放在文档顶部的代码单元中:

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)

这将创建以下按钮,以切换显示/隐藏Jupyter Notebook的代码,默认为“隐藏”状态:

隐藏代码状态

设置为“显示”状态后,您可以查看Jupyter Notebook的代码:

显示代码状态

顺便说一句,尽管大部分代码应放在笔记本的开头,但切换按钮的位置是可选的。就个人而言,我更喜欢将其保留在文档的底部。为此,只需将display(button)行移动到页面底部的单独的代码单元中:

重新定位的切换按钮


7

为了更好地显示打印的文档或报告,我们还需要删除按钮,以及显示或隐藏某些代码块的功能。这是我使用的方法(只需将其复制粘贴到您的第一个单元格中):

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

然后在下一个单元格中:

hide_me
print "this code will be hidden"

print "this code will be shown"

我猜想这不适用于最新版本/ python 3?
baxx

与jupyter 4.3.0版和Python 3.6.1版一起使用。
Alma Rahat

谢谢!很高兴地说,这也适用于Jupyter Notebook 5.3.1。我正在使用Python 3.6.1
Amitrajit Bose

4

这将呈现一个IPython Notebook输出。但是,您将注意到能够查看输入代码。您可以复制一个笔记本,然后添加此代码(如果需要)与不需要查看代码的人共享。

from IPython.display import HTML

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

1
@Rocketq使用它-– from IPython.display import HTML HTML('''<script> $('div.input').show()''')
fixxxer


1

这是p3trus建议的另一种解决方案:

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

p3trus所述:“ [[它]向ipython笔记本工具栏添加了一个按钮,以隐藏/显示输入代码单元。要使用它,必须将custom.js文件放在.ipython_<profile name>/static/custom/文件夹中, 是正在使用的ipython配置文件。”

我自己的意见:我验证了此解决方案,并且可以在iPython 3.1.0上使用。


1

接受的解决方案还可以在julia Jupyter / IJulia中进行以下修改:

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

特别注意:

  • 使用display功能
  • 转义$符号(否则视为变量)

我很困惑如何使它工作。是否需要导入语句以及该框应为哪种类型的框。一个原始的还是一个代码框?
J Spen

1

是一篇不错的文章(与@Ken发表的文章相同),涉及如何完善Jpuyter(新的IPython)笔记本以进行演示。有无数种使用JS,HTML和CSS扩展Jupyter的方法,包括通过javascript与笔记本的python内核进行通信的能力。有魔术装饰器%%HTML%%javascript因此您可以自己在单元格中执行以下操作:

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

我也可以证明Chris的方法在jupyter 4.XX中有效


1

使用浏览器的控制台非常简单的解决方案。您将此复制到浏览器控制台中,然后按Enter:

$("div.input div.prompt_container").on('click', function(e){
    $($(e.target).closest('div.input').find('div.input_area')[0]).toggle();
});

将脚本插入浏览器控制台

然后,您只需单击单元格输入的数量即可切换单元格的代码。

细胞数量


0

(纸)打印或另存为HTML

对于那些希望打印到纸上的输出,仅上述答案似乎并不能给出很好的最终输出。但是,采用@Max Masnick的代码并添加以下内容,可以将其打印在完整的A4页上。

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

缩进的原因是Max Masnick删除了提示部分,这意味着所有内容都移至输出的左侧。但是,这对于限制为的最大输出宽度没有任何作用max-width:100%-14ex;。这会将output_subarea的最大宽度更改为max-width:100%;


0

使用以上所有解决方案,即使您隐藏了代码,您仍然可以获得 [<matplotlib.lines.Line2D at 0x128514278>]您可能不想要的东西。

如果您实际上想摆脱输入而不只是隐藏输入,我认为最干净的解决方案是将图形保存到磁盘中隐藏的单元格中,然后使用例如在Markdown单元格中包含图像![Caption](figure1.png)


3
您可以将_ = plt.plot()其打印成[<>]废话
jonnybazookatone

3
在matplotlib绘图命令后放置分号可以抑制不必要的输出。
DakotaD

0
jupyter nbconvert testing.ipynb --to html --no-input

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.