У меня есть блокнот ipython / jupyter, который я визуализирую с помощью NBviewer.
Как я могу скрыть весь код из записной книжки, созданной NBviewer, чтобы отображались только выходные данные кода (например, графики и таблицы) и ячейки уценки?
У меня есть блокнот ipython / jupyter, который я визуализирую с помощью NBviewer.
Как я могу скрыть весь код из записной книжки, созданной NBviewer, чтобы отображались только выходные данные кода (например, графики и таблицы) и ячейки уценки?
Ответы:
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>''')
<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>.
Теперь это возможно напрямую из nbconvert начиная с версии 5.2.1 : контент можно фильтровать с помощью встроенного в экспортер шаблонов параметров exclude . Например:
jupyter nbconvert --to pdf --TemplateExporter.exclude_input=True my_notebook.ipynb
исключит ячейки «входного кода», то есть сам код. Подобные вариантыСуществуют для исключения запросов, ячеек уценки или выходов, а также входов и выходов.
(Эти параметры должны работать независимо от формата вывода.)
Я бы использовал 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.
Отредактируйте файл custom.js где-нибудь в каталоге IPython (мой был в profile_default / static / custom ), чтобы он был похож на файл custom.example.js в каталоге nbextensions .
Добавьте эту строку в custom.js :
IPython.load_extensions('usability/hide_input_all')
В IPython Notebook теперь есть кнопка для переключения ячеек кода независимо от рабочей книги.
Новейшая версия ноутбука 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>")
});
Я написал некоторый код, который выполняет это, и добавляет кнопку для переключения видимости кода.
В ячейку кода в верхней части записной книжки входит следующее:
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-версии ноутбука.
'.input_area'
и '.prompt'
используйте, 'div.input'
и это работает как шарм! Итак, подведем итог, заменить jQuery("div.input").toggle();
на место jQuery('.input_area').toggle(); jQuery('.prompt').toggle();
. @ Макс Масник, не могли бы вы исправить свой ответ?
CSS = """#notebook div.output_subarea { max-width:100%;"""
HTML('<style>{}</style>'.format(CSS))
, Это очень полезно для печати.
Это можно сделать, используя ToggleButton
виджет IPython и немного 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, по умолчанию в состоянии «скрыть»:
Когда вы установите состояние «show», вы сможете увидеть код для Jupyter Notebook:
Кроме того, хотя большая часть этого кода должна быть размещена в начале Блокнота, расположение кнопки переключения не является обязательным. Лично я предпочитаю держать это в нижней части документа. Для этого просто переместите display(button)
строку в отдельную ячейку кода внизу страницы:
Существует хорошее решение , предоставляемое здесь , что хорошо работает для ноутбуков на экспорт в HTML. Веб-сайт даже ссылается сюда на этот пост, но я не вижу решения Криса здесь! (Крис, где ты?)
Это в основном то же решение, что и принятый ответ от harshil, но оно имеет преимущество в том, что скрывает сам код переключения в экспортированном HTML. Мне также нравится, что этот подход устраняет необходимость в HTML-функции IPython.
Чтобы реализовать это решение, добавьте следующий код в ячейку «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: [##]
текст и снижает рентабельность на левой стороне .
$('div.output').next().hide('500');
скрыть следующий вывод? Я попробовал себя, но не могу заставить это работать.
Для лучшего отображения с напечатанным документом или отчетом нам также необходимо удалить кнопку и возможность показать или скрыть определенные блоки кода. Вот что я использую (просто скопируйте и вставьте это в свою первую ячейку):
# 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"
Это отобразит вывод записной книжки IPython. Тем не менее, вы заметите, сможете просматривать входной код. Вы можете скопировать записную книжку, а затем добавить этот код, если необходимо, чтобы поделиться с кем-то, кому не нужно просматривать код.
from IPython.display import HTML
HTML('''<script> $('div .input').hide()''')
from IPython.display import HTML HTML('''<script> $('div.input').show()''')
Преобразуйте ячейку в Markdown и используйте <details>
тег HTML5, как в примере joyrexus
:
https://gist.github.com/joyrexus/16041f2426450e73f5df9391f7f7ae5f
## collapsible markdown?
<details><summary>CLICK ME</summary>
<p>
#### yes, even hidden code blocks!
```python
print("hello world!")
```
</p>
</details>
Вот еще одно решение, предложенное 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.
Принятое решение также работает в Юлии Юпитер / 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
функцию$
знак (иначе рассматривается как переменная)Вот хорошая статья (написанная @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.XX
Очень простое решение с помощью консоли браузера. Вы копируете это в консоль браузера и нажимаете ввод:
$("div.input div.prompt_container").on('click', function(e){
$($(e.target).closest('div.input').find('div.input_area')[0]).toggle();
});
Затем вы переключаете код ячейки, просто нажав на номер ячейки ввода.
(Бумага) Печать или сохранение в формате 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%;
.
Со всеми вышеупомянутыми решениями, даже если вы скрываете код, вы все равно получите [<matplotlib.lines.Line2D at 0x128514278>]
дерьмо над своей фигурой, которое вы, вероятно, не хотите.
Если вы действительно хотите избавиться от входа , а не просто скрываю это, я думаю , что самое чистое решение , чтобы сохранить цифры на диск в скрытых ячейках, а затем просто включая изображение в клетках Markdown , используя , например ![Caption](figure1.png)
.
_ = plt.plot()
чтобы это не печатать [<>]
дерьмо
jupyter nbconvert yourNotebook.ipynb --no-input --no-prompt