Как скрыть код из ячеек в 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). Вот как:

  1. узнайте, где находится ваш каталог IPython:

    from IPython.utils.path import get_ipython_dir
    print get_ipython_dir()
    
  2. скачать nbextensions и переместите его в каталог IPython.

  3. редактировать таможни.js файл где-то в каталоге IPython (мой быть profile_default / static / custom) быть похожим на таможни.образец.js на nbextensions


новейшая версия ноутбука IPython больше не позволяет выполнять 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 здесь.

обновление: это будет иметь забавное поведение с ячейками Markdown в 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. Сайт даже ссылается на этот пост, но я не вижу решения Криса здесь! (Крис, где ты?)

это в основном то же решение, что и принятый ответ от 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. Тем не менее, вы заметите, что сможете просмотреть входной код. Вы можете скопировать блокнот, а затем добавить этот код, если необходимо поделиться с кем-то, кому не нужно просматривать код.

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

исключит ячейки "входного кода", то есть сам код. похожие варианты exist для исключения приглашений, ячеек уценки или выходов или обоих входов и выходов.

(эти параметры должны работать независимо от формата.)


(Бумага) - печать или сохранение в HTML

для тех из вас, кто хочет распечатать на бумаге результаты, приведенные выше ответы, похоже, не дают хорошего конечного результата. Однако, взяв код @Max Masnick и добавив следующее, Можно распечатать его на полной странице формата А4.

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

поводом для отступа, что оперативное разделе удален Макс Masnick значит все смещается влево на выход. Это, однако, ничего не сделало для максимальной ширины выход, который был ограничен 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, используя, например,![Caption](figure1.png).


здесь хорошая статья (тот же самый @Ken опубликовал) о том, как отполировать 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.Х. Х.