Як приховати код від комірок у ноутбуці ipython, візуалізованому за допомогою nbviewer?


147

У мене є ноутбук з ipython / jupyter, який я візуалізую за допомогою NBviewer.

Як я можу приховати весь код із зошита, виданого NBviewer, щоб відображалися лише вихідні дані коду (наприклад, графіки та таблиці) та комірки розмітки?


10
Для інтерфейсу за замовчуванням (лютий 2016) для цього ще не існує кнопки для цього. ІМХО це насправді дратує. Це в списку функцій, які будуть реалізовані: github.com/jupyter/notebook/isissue/534 Це чудово. Я з нетерпінням чекаю цього.
стохастичний

1
Будь ласка, подивіться нижче на відповідь Ноя. З включенням 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". Рекомендуйте розмістити це у власній комірці вгорі зошита.
Вівек Гані

якщо ви додасте атрибут accesskey = "h" до вхідного елемента, тоді ви можете зробити показ ховати за допомогою alt-h (принаймні, у хромі)
frankc

7
Як би ви змінили це, щоб він навіть не показував кнопку, він просто приховує код?
Харлекуін

79

Тепер це можливо безпосередньо з nbconvert версії 5.2.1 : вміст можна відфільтрувати за допомогою вбудованого експортера шаблонів виключення . Наприклад:

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

буде виключати комірки "вхідного коду", тобто сам код. Існують подібні параметри, щоб виключити підказки, комірки розмітки або виходи, або обидва входи та виходи.

(Ці параметри повинні працювати незалежно від формату виводу.)


3
це найкраща відповідь
skurp

Де експорт .pdf зберігається за замовчуванням?
MyopicVisage

Та ж папка, що й ноутбук .ipython. Використовуйте аргумент "--output NotebookNoCode", щоб перейменувати файл.
MyopicVisage

Це повинно працювати в зошиті?
lcrmorin

@were_cat ні, це команда оболонки, яка використовується для експорту файлу ноутбука .ipynb; у цьому прикладі він перетворюється на pdf
Ноя

19

Я б користувався 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. Відредагуйте свій файл custom.js десь у каталозі IPython (мій був у profile_default / static / custom ), щоб він був подібний до custom.example.js у каталозі nbextensions .

  4. Додайте цей рядок до custom.js :

    IPython.load_extensions('usability/hide_input_all')

Тепер у блокноті IPython з'явиться кнопка для перемикання комірок коду, незалежно від робочої книги.


6
Щойно спробував це - схоже, це допомагає приховати комірки коду під час редагування ноутбука, хоча під час збереження ноутбука в html (тобто надання в nbviewer) комірки коду все ще з’являються.
Vivek Gani

@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

Дивно, що рішення не працювало для мене, оскільки меню перегляду iPython залишається незмінним. (iPython 3.1.0) Ваше рішення надихнуло мене шукати далі і знайти дуже подібне рішення від p3trus, який додав кнопку замість меню, і це спрацювало.
ахмед

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, ви можете подивитися тут .

Оновлення: це матиме кумедну поведінку із клітинками Markdown у Jupyter, але це чудово працює у версії для експорту HTML у ноутбук.


3
Це працює на клітинках коду, але якщо у вас є комірки розмітки, це робить щось дивне. Він показує розмітку як розмітку , а потім показує той самий вміст, але відформатований - нижче.
Скотт Н

Я щойно зрозумів, що єдине, що не так - специфікація вузла. Замість '.input_area'і '.prompt'використовуйте, 'div.input'і це працює як шарм! Тож резюмувати, замінювати jQuery("div.input").toggle();замість jQuery('.input_area').toggle(); jQuery('.prompt').toggle();. @Max Masnick, ти міг би виправити свою відповідь?
Скотт Н

Використання "div.input" в якості вибору вузла працює до тих пір, поки ви не взаємодієте з клітинками розмітки, але я просто зрозумів, що якщо ви взаємодієте з клітинками розмітки, ви можете отримати певну поведінку. Наприклад, якщо двічі клацнути клітинку розмітки, вона повністю прихована. Отже, як і є, мій підхід до рішення Макса чудово підходить для створення HTML для спільного використання з іншими, але не для того, щоб згодом занадто сильно взаємодіяти з ним.
Скотт Н

Так, я помітив те саме, що ви робили з клітинами Маркдауна, коли всі були забиті. Він добре працює при експортуванні HTML, саме там я його і використовую. Я відредагую відповідь, щоб відзначити це.
Макс Маснік

1
Щоб видалити залишок правого простору від видалення ".prompt", просто додайте цей код до кінця вищевказаного коду. CSS = """#notebook div.output_subarea { max-width:100%;""" HTML('<style>{}</style>'.format(CSS)). Це дуже корисно для друку.
Столи маленького бобіка

10

Це можна зробити за допомогою 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)

Це створює наступну кнопку для перемикання показу / приховування коду для ноутбука Юпітера, дефолтом якого є стан "приховати":

Сховати стан коду

Якщо встановлено стан "показ", ви зможете побачити код для ноутбука Юпітера:

Показати стан коду

Окрім того, хоча значна частина цього коду має бути розміщена на початку Ноутбука, розташування кнопки перемикання необов’язково. Особисто я вважаю за краще зберігати його внизу документа. Для цього просто перемістіть display(button)рядок до окремої кодової комірки внизу сторінки:

Переміщена кнопка перемикання


9

Існує приємне рішення тут , що добре працює для ноутбуків на експорт в 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: [##]текст та зменшує поля зліва.


чи можна було б використовувати цей код для вибіркового приховування результатів натисканням кнопки? IE, $('div.output').next().hide('500');щоб приховати наступний вихід? Я спробував себе, але не можу, щоб це спрацювало.
Брайан Кіт

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

Працює з версією версії 4.3.0 з версією Python 3.6.1.
Алма Рахат

Дякую! Раді сказати, що це працює і з ноутбуком Юпітера 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


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

Прийняте рішення також працює в Джулії Юпітер / 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) для презентації. Існує незліченна кількість способів розширити 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


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-width:100%-14ex;. Це змінює максимальну ширину вихідної підсумкової зони на max-width:100%;.


0

З усіма рішеннями вище, навіть якщо ви приховуєте код, ви все одно отримаєте [<matplotlib.lines.Line2D at 0x128514278>]лайно над фігурою, яку, напевно, не хочете.

Якщо ви насправді хочете позбутися від введення, а не просто приховувати його, я думаю, що найчистішим рішенням є збереження ваших фігур на диску в прихованих комірках, а потім просто включення зображень у клітинки Markdown за допомогою напр ![Caption](figure1.png).


3
Ви можете поставити, _ = plt.plot()щоб не було друкованого [<>]лайна
jonnybazookatone

3
Розміщення крапки з комою після команд графіки matplotlib придушило для мене небажаний вихід.
DakotaD


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.