nbviewer로 시각화 된 ipython 노트북의 셀에서 코드를 숨기는 방법은 무엇입니까?


147

NBviewer를 사용하여 시각화하는 ipython / jupyter 노트북이 있습니다.

NBviewer가 렌더링 한 노트북에서 모든 코드를 숨겨서 코드 출력 (예 : 플롯 및 테이블)과 마크 다운 셀만 표시하려면 어떻게해야합니까?


10
기본 UI (2016 년 2 월)에는 아직이 버튼이 없습니다. IMHO 이것은 정말 성가시다. 이것은 구현 될 기능 목록에 있습니다 : github.com/jupyter/notebook/issues/534 훌륭합니다. 나는 그것을 기대합니다.
— stochastic

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

입력 요소에 속성 accesskey = "h"를 추가하면 alt-h (최소한 크롬)로 show hide를 수행 할 수 있습니다.
— frankc

7
버튼을 표시하지 않고 코드를 숨기도록 어떻게 변경합니까?
— Harlekuin

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

내가 사용하는 것이 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 / 정적 / 사용자 지정 받는 사람과 유사하게) custom.example.js 에서 nbextensions의 디렉토리.

  4. 이 행을 custom.js에 추가하십시오 .

    IPython.load_extensions('usability/hide_input_all')

이제 IPython Notebook에는 통합 문서에 관계없이 코드 셀을 전환 할 수있는 버튼이 있습니다.


6
노트북을 html (예 : nbviewer로 렌더링)로 저장할 때 코드 셀이 여전히 나타나지만 노트북을 편집하는 동안 코드 셀을 숨기는 데 도움이되는 것처럼 보입니다.
— Vivek Gani

@VivekGani는 동일한 리포지토리와 함께 제공된 템플릿을 사용하여 내 보낸 HTML에 숨겨진 셀을 숨길 수 있습니다. 관련 문서 페이지를 참조하십시오 (또한 이 관련 질문 참조 )
— glS

15

최신 IPython 노트북 버전은 더 이상 markdown 셀에서 javascript를 실행할 수 없으므로 다음 javascript 코드로 새 markdown 셀을 추가하면 더 이상 코드 셀을 숨길 수 없습니다 ( 이 링크 참조 )

~ / .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 가 더 유사하게 찾고 매우 유사한 솔루션을 찾도록 영감을 주었으며 효과가있었습니다.
— 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
이것은 코드 셀에서 작동하지만 마크 다운 셀이 있으면 이상한 일을합니다. 그것은 보여줍니다 인하 가격 인하 등을 하고 같은 내용을 보여줍니다 -하지만 형식 - 아래.
— Scott H

방금 노드 사양이 잘못되었다는 것을 알았습니다. '.input_area'및 대신에 '.prompt'사용 'div.input'하고 매력처럼 작동합니다! 요약하자면, 대신 jQuery("div.input").toggle();에 대체하십시오 jQuery('.input_area').toggle(); jQuery('.prompt').toggle();. @ Max Masnick, 답을 고칠 수 있습니까?
— Scott H

마크 다운 셀과 상호 작용하지 않는 한 노드 선택으로 "div.input"을 사용하지만 마크 다운 셀과 상호 작용하면 펑키 한 동작이 발생할 수 있다는 것을 알았습니다. 예를 들어 마크 다운 셀을 두 번 클릭하면 완전히 숨겨집니다. 따라서 Max의 솔루션에 대한 나의 조정은 다른 사람들과 공유하기 위해 HTML을 생성하는 데는 좋지만 그 이후에는 너무 많이 상호 작용하지는 않습니다.
— Scott H

네, 마크 다운 셀을 다 사용했을 때와 같은 일을 했어요. HTML 내보내기에서 잘 작동합니다. 이에 대한 답변을 편집하겠습니다.
— Max Masnick

1
".prompt"제거에서 남은 공간을 제거하려면 위 코드 끝에이 코드를 추가하십시오. CSS = """#notebook div.output_subarea { max-width:100%;""" HTML('<style>{}</style>'.format(CSS)). 이것은 인쇄에 매우 유용합니다.
— 리틀 바비 테이블

10

이것은 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의 코드 표시 / 숨김을 토글하기 위해 다음과 같은 버튼이 생성되며 기본값은 "숨기기"상태입니다.

코드 상태 숨기기

"show"상태로 설정하면 Jupyter Notebook의 코드를 볼 수 있습니다.

코드 상태 표시

또한이 코드의 대부분은 노트북의 시작 부분에 배치해야하지만 토글 버튼의 ​​위치는 선택 사항입니다. 개인적으로 문서 하단에 보관하는 것을 선호합니다. 이렇게하려면 display(button)페이지 맨 아래에있는 별도의 코드 셀로 행을 이동 하십시오.

재배치 된 토글 버튼


9

여기에는 HTML로 내 보낸 노트북에 적합한 솔루션이 있습니다 . 웹 사이트는이 SO 게시물로 다시 연결되지만 Chris의 솔루션은 여기에 없습니다! (크리스, 어디있어?)

이것은 기본적으로 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로 내 보냅니다. 노트북 상단에는 코드를 표시하거나 숨길 수있는 토글 버튼이 있습니다.

Chris는 여기 에 예제를 제공합니다 .

Jupyter 5.0.0에서 작동하는지 확인할 수 있습니다.

업데이트 : div.prompt요소와 함께 요소 를 표시하거나 숨기는 것도 편리합니다 div.input. 그러면 In [##]:및 Out: [##]텍스트가 제거되고 왼쪽의 여백이 줄어 듭니다.


이 코드를 사용하여 버튼 클릭으로 출력을 선택적으로 숨길 수 있습니까? $('div.output').next().hide('500');다음 출력을 숨길 IE ? 나는 나 자신을 시도했지만 이것을 작동시킬 수 없다.
— 브라이언 키스

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

감사! Jupyter 노트북 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의 설명에 따르면 : "[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

1

다음 은 프리젠 테이션을 위해 Jpuyter (새로운 IPython) 노트북을 연마하는 방법에 대한 좋은 기사 (@Ken이 게시 한 기사)입니다. 자바 스크립트에서 노트북의 파이썬 커널과 통신하는 기능을 포함하여 JS, HTML 및 CSS를 사용하여 Jupyter를 확장하는 방법은 무수히 많습니다. 매직 장식이 있습니다 %%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

0
jupyter nbconvert testing.ipynb --to html --no-input

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.