nbviewerで視覚化されたipythonノートブックのセルからコードを非表示にする方法は?


147

NBviewerを使用して視覚化するipython / jupyterノートブックを持っています。

NBviewerによってレンダリングされたノートブックからすべてのコードを非表示にして、コードの出力(プロットやテーブルなど)とマークダウンセルのみが表示されるようにするにはどうすればよいですか?


10
デフォルトのUIには、このための既存のボタンはまだありません(2016年2月)。私見これは本当に本当に迷惑です。これは実装される機能のリストにあります:github.com/jupyter/notebook/issues/534 それは素晴らしいです。楽しみにしています。
確率論的

1
以下のノアの回答をご覧ください。TemplateExporterを含めることで、この問題は出力形式に関係なく解決されます。執筆時点では、Noahsの回答はharshilsの回答に取って代わります(これは、TemplateExporterよりも優れたソリューションです)。
MichaelA

回答:


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などの特定のコードブロックを非表示または表示する機能が必要な場合は、私の回答を参照してください。
jaycode

3
おかげで、これは機能し、「htmlへの保存」でも機能します。これをノートブックの上部にある独自のセルに配置することをお勧めします。
Vivek Gani、2016

属性accesskey = "h"をinput要素に追加すると、alt-h(少なくともchrome)でshow hideを実行できます
frankc

7
ボタンを表示せず、コードを非表示にするために、これをどのように変更しますか?
Harlekuin 2017

79

これは、バージョン5.2.1以降、nbconvertから直接実行できるようになりました。コンテンツは、組み込みのテンプレートエクスポータの除外オプションを使用してフィルタリングできます。例えば:

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

「入力コード」セル、つまりコード自体を除外します。同様のオプションプロンプト、マークダウンセル、出力、または入力と出力の両方を除外するためのがあります。

(これらのオプションは、出力形式に関係なく機能するはずです。)


3
これが最良の答えです
skurp

.pdfエクスポートはデフォルトでどこに保存されますか?
MyopicVisage

.ipythonノートブックと同じフォルダー。引数 '--output NotebookNoCode'を使用して、ファイルの名前を変更します。
MyopicVisage

これはノートブックで実行されるはずですか?
lcrmorin

@were_catいいえ、これは.ipynbノートブックファイルをエクスポートするために使用されるシェルコマンドです。この例では、PDFに変換されます
Noah

19

私はnbextensionshttps://github.com/ipython-contrib/IPython-notebook-extensionshide_input_allから使用します。方法は次のとおりです。

  1. IPythonディレクトリの場所を確認します。

    from IPython.utils.path import get_ipython_dir
    print get_ipython_dir()
  2. nbextensionsをダウンロードして、IPythonディレクトリに移動します。

  3. IPythonディレクトリのどこかにあるcustom.jsファイルを編集して(私のプロファイルprofile_default / static / customにありました)、nbextensionsディレクトリのcustom.example.jsのようにし ます。

  4. 次の行をcustom.jsに追加します

    IPython.load_extensions('usability/hide_input_all')

IPython Notebookには、ワークブックに関係なく、コードセルを切り替えるボタンがあります。


6
ちょうどこれを試してみました-ノートブックをHTMLに保存するとき(つまり、nbviewerにレンダリングするとき)、コードセルはまだ表示されますが、ノートブックの編集中にコードセルを非表示にするのに役立つようです。
Vivek Gani、2016

@VivekGaniは、同じリポジトリで提供されるテンプレートを使用して、エクスポートされたhtmlで非表示のセルを非表示にしておくことができるという簡単なメモです。関連するドキュメントページを参照してください(また、この関連する質問を参照してください)
glS

15

最新のIPythonノートブックバージョンでは、マークダウンセルでJavaScriptを実行できなくなったため、次のJavaScriptコードで新しいマークダウンセルを追加しても、コードセルを非表示にできなくなります(このリンクを参照

〜/ .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 2015

奇妙なことに、iPythonのビューメニューは変更されていないため、このソリューションは機能しませんでした。(iPython 3.1.0)あなたのソリューションは、メニューの代わりにボタンを追加したp3trusによる非常によく似たソリューションをさらに調べて見つけるように促しました。
akhmed

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 として表示され、次に同じコンテンツがフォーマットされて表示されます。
スコットH

私が間違っているのはノードの仕様だけだと気づいたところです。'.input_area'andの代わりに'.prompt'使用する'div.input'と、魅力的に機能します。要約すると、の代わりに使用jQuery("div.input").toggle();jQuery('.input_area').toggle(); jQuery('.prompt').toggle();ます。@マックスマニック、あなたの答えを修正できますか?
スコットH

マークダウンセルを操作しない限りノード選択として「div.input」を使用できますが、マークダウンセルを操作するとファンキーな動作が発生する可能性があることがわかりました。たとえば、マークダウンセルをダブルクリックすると、完全に非表示になります。したがって、現状のままで、私のMaxのソリューションへの微調整は、他のユーザーと共有するHTMLを生成するためには問題ありませんが、その後、HTMLとやり取りしすぎないようにするためのものではありません。
スコットH

ええ、私はあなたがMarkdownセルをすべてジャッキアップするのと同じことに気づきました。私が使用しているHTMLエクスポートでは問題なく機能します。これに注意して回答を編集します。
Max Masnick 2015

1
「.prompt」の削除から残りの右スペースを削除するには、このコードを上記のコードの最後に追加するだけです。 CSS = """#notebook div.output_subarea { max-width:100%;""" HTML('<style>{}</style>'.format(CSS))。これは印刷に非常に便利です。
リトルボビーテーブル

9

ここに提供される素晴らしい解決策があり ますHTMLにエクスポートされたノートブックで適切に機能されています。ウェブサイトはここからこのSO投稿にリンクしていますが、クリスの解決策はここにはありません!(クリス、どこにいるの?)

これは基本的にはharshilから受け入れられた回答と同じソリューションですが、エクスポートされたHTMLでトグルコード自体を隠すという利点があります。また、このアプローチにより、IPython HTML関数が不要になることも気に入っています。

このソリューションを実装するには、ノートブックの上部にある「Raw 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');は次の出力を非表示にしますか?私は自分で試しましたが、これを機能させることができません。
ブライアンキース

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のコードが表示されます。

コードの状態を表示

余談ですが、このコードの多くは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 2017

ありがとう!これはJupyter Notebook 5.3.1で動作することを嬉しく思いますでもます。Pythonバージョン3.6.1
Amitrajit Bose

4

これにより、IPythonノートブック出力がレンダリングされます。ただし、入力コードを表示できることに注意してください。ノートブックをコピーし、必要に応じてこのコードを追加して、コードを表示する必要のない人と共有することができます。

from IPython.display import HTML

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

1
@Rocketqがこれを使用 from IPython.display import HTML HTML('''<script> $('div.input').show()''')
fixxxer 2018


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で説明されているように「[It]は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 2016年

1

ここに、プレゼンテーション用のJpuyter(新しいIPython)ノートブックを洗練する方法に関する素晴らしい記事(@Kenが投稿した同じ記事)があります。JavaScript、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>

Jupyter 4.XXでChrisのメソッドが機能することを保証することもできます


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 2017


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.