Как скрыть код из ячеек в IPython notebook, визуализированный с помощью nbviewer?
У меня есть ноутбук ipython/jupyter, который я визуализирую с помощью NBviewer.
Как я могу скрыть весь код из записной книжки, отображаемой NBviewer, так что отображаются только выходные данные кода (например, графики и таблицы) и ячейки уценки?
14 ответов:
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>''')
Я хотел бы использовать
hide_input_allС nbextensions (https://github.com/ipython-contrib/IPython-notebook-extensions). Вот как:
узнайте, где находится ваш каталог IPython:
from IPython.utils.path import get_ipython_dir print get_ipython_dir()скачать nbextensions и переместите его в каталог IPython.
редактировать таможни.js файл где-то в каталоге IPython (мой быть profile_default / static / custom), чтобы быть похожими на таможни.образец.js на nbextensions
новейшая версия IPython notebook больше не позволяет выполнять javascript в ячейках markdown, поэтому добавление новой ячейки markdown со следующим кодом javascript больше не будет работать, чтобы скрыть ваши ячейки кода (см. этой ссылке)
изменить ~/.оболочкой IPython/profile_default/статический/таможня/таможня.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>") });
Я написал некоторый код, который выполняет это, и добавляет кнопку для переключения видимости кода.
в ячейке кода в верхней части записной книжки находится следующее:
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, но он отлично работает в HTML экспортной версии ноутбука.
для лучшего отображения с печатным документом или отчетом, нам нужно удалить кнопку, а также возможность показывать или скрывать определенные блоки кода. Вот что я использую (просто скопируйте-вставьте это в свою первую ячейку):
# 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"
есть хорошее решение при условии здесь это хорошо работает для ноутбуков, экспортированных в 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: [##]текст и уменьшает поля слева.
используйте Runtools, который расширяет базовый ноутбук iPython:
https://github.com/ipython-contrib/IPython-notebook-extensions/wiki/Runtools
это отобразит вывод IPython notebook. Однако вы заметите, что сможете просматривать входной код. Вы можете скопировать записную книжку, а затем добавить этот код, если это необходимо, чтобы поделиться с кем-то, кому не нужно просматривать код.
from IPython.display import HTML HTML('''<script> $('div .input').hide()''')
вот еще одно решение, предложенное 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 notebook, чтобы скрыть / показать ячейку входного кода. Чтобы использовать его, вы должны поставить обычай.js файл в вашем
теперь это возможно непосредственно из nbconvert начиная с версии 5.2.1: содержимое может быть отфильтровано с помощью встроенного экспортер шаблонов исключает опции. Например:
jupyter nbconvert --to pdf --TemplateExporter.exclude_input=True my_notebook.ipynbисключит ячейки "входной код", т. е. сам код. похожие варианты существует для исключения подсказок, ячеек уценки или выходов или обоих входов и выходов.
(эти параметры должны работать независимо от формата.)
(Бумага) - печать или сохранение в 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-width:100%-14ex;. Это изменяет максимальную ширину output_subarea наmax-width:100%;.
принятое решение также работает в 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функции- побег
$знак (иначе рассматривается как переменная)
со всеми решениями выше, даже если вы скрываете код, вы все равно получите
[<matplotlib.lines.Line2D at 0x128514278>]дерьмо выше вашей фигуры, которую вы, вероятно, не хотите.Если вы действительно хотите избавиться от ввода, а не просто скрывает это, я думаю самое чистое решение-сохранить ваши фигуры на диск в скрытых ячейках, а затем просто включить изображения в ячейки Markdown, используя, например,
.
здесь это хорошая статья (тот же @Ken posted) о том, как отполировать jpuyter (новый IPython) ноутбуки для презентации. Существует бесчисленное множество способов расширения Jupyter с помощью JS, HTML и CSS, включая возможность взаимодействия с ядром python ноутбука из javascript. Есть волшебные декораторы для
%%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.Х. Х.
Comments