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.