Bagaimana cara menyembunyikan kode dari sel di notebook ipython divisualisasikan dengan nbviewer?

147

Saya memiliki notebook ipython / jupyter yang saya visualisasikan menggunakan NBviewer.

Bagaimana saya bisa menyembunyikan semua kode dari notebook yang dibuat oleh NBviewer, sehingga hanya output kode (mis. Plot dan tabel) dan sel-sel penurunan harga ditampilkan?

lucacerone
sumber
10
Masih belum ada tombol untuk ini di UI default (Feb 2016). IMHO ini benar-benar sangat menjengkelkan. Ini ada dalam daftar fitur yang akan diterapkan: github.com/jupyter/notebook/issues/534 Itu hebat. Saya menantikannya.
stokastik
1
Silakan lihat di bawah pada jawaban Nuh. Dengan dimasukkannya TemplateExporter masalah ini diselesaikan terlepas dari format output. Pada saat penulisan jawaban Nuh menggantikan jawaban harshils (yang merupakan solusi yang bagus untuk TemplateExporter).
MichaelA

Jawaban:

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>''')
Harshil
sumber
5
Bekerja untuk saya di iPython 3.1.0 jika saya memasukkannya ke dalam sel kode. Saya mengganti <form action ... > ... </form>dengan HTML sederhana sepertiThe 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
Terima kasih atas jawaban Anda! Lihat jawaban saya jika Anda perlu tombol untuk disembunyikan dan kemampuan untuk menyembunyikan atau menampilkan blok kode tertentu seperti Rstudio.
jaycode
3
Terima kasih, ini berfungsi dan dengan 'save to html' juga. Sarankan menempatkan ini di selnya sendiri di bagian atas notebook.
Vivek Gani
jika Anda menambahkan atribut accesskey = "h" ke elemen input maka Anda dapat melakukan show hide dengan alt-h (setidaknya di chrome)
frankc
7
Bagaimana Anda mengubah ini sehingga bahkan tidak menunjukkan tombol, itu hanya menyembunyikan kodenya?
Harlekuin
79

Ini sekarang dimungkinkan secara langsung dari nbconvert pada versi 5.2.1 : konten dapat difilter menggunakan opsi templat eksportir yang disertakan . Sebagai contoh:

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

akan mengecualikan sel "kode input", yaitu kode itu sendiri. Pilihan serupa ada untuk mengecualikan prompt, sel penurunan harga, atau output, atau input dan output.

(Opsi ini harus bekerja terlepas dari format output.)

Nuh
sumber
3
ini adalah jawaban terbaik
skurp
Di mana ekspor .pdf disimpan secara default?
MyopicVisage
Folder yang sama dengan notebook .ipython. Gunakan argumen '--output NotebookNoCode' untuk mengganti nama file.
MyopicVisage
Apakah ini seharusnya berjalan di notebook?
lcrmorin
@were_cat tidak, ini adalah perintah shell yang digunakan untuk mengekspor file notebook .ipynb; dalam contoh ini, ia akan dikonversi ke pdf
Nuh
19

Saya akan menggunakan hide_input_alldari nbextensions ( https://github.com/ipython-contrib/IPython-notebook-extensions ). Begini caranya:

  1. Cari tahu di mana direktori IPython Anda berada:

    from IPython.utils.path import get_ipython_dir
    print get_ipython_dir()
  2. Unduh nbextensions dan pindahkan ke direktori IPython.

  3. Edit file custom.js Anda di suatu tempat di direktori IPython (milik saya ada di profile_default / static / custom ) agar mirip dengan custom.example.js di direktori nbextensions .

  4. Tambahkan baris ini ke custom.js :

    IPython.load_extensions('usability/hide_input_all')

Notebook IPython sekarang akan memiliki tombol untuk beralih sel kode, tidak peduli buku kerja.

pengguna394430
sumber
6
Baru saja mencoba ini - sepertinya membantu menyembunyikan sel kode saat mengedit buku catatan, walaupun saat menyimpan buku catatan ke html (yaitu rendering ke nbviewer) sel kode masih muncul.
Vivek Gani
@VivekGani hanya catatan singkat bahwa Anda dapat menjaga sel-sel tersembunyi disembunyikan dalam html yang diekspor menggunakan template yang disediakan dengan repo yang sama, lihat halaman dokumen yang relevan (juga, lihat pertanyaan yang relevan ini )
glS
15

Versi notebook IPython terbaru tidak lagi memungkinkan mengeksekusi javascript dalam sel penurunan harga, jadi menambahkan sel penurunan harga baru dengan kode javascript berikut tidak akan berfungsi lagi untuk menyembunyikan sel kode Anda (lihat tautan ini )

Ubah ~ / .ipython / profile_default / static / custom / custom.js seperti di bawah ini:

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>")
});
Yangshun Tay
sumber
persis apa yang saya cari!
lucky1928
Anehnya solusi itu tidak bekerja untuk saya karena menu tampilan iPython tetap tidak berubah. (iPython 3.1.0) Solusi Anda mengilhami saya untuk mencari lebih jauh dan menemukan solusi yang sangat mirip oleh p3trus yang menambahkan tombol alih-alih menu dan itu berhasil.
akhmed
1
@akhmed Mungkin Anda bisa merujuk ke stackoverflow.com/a/29851084/1914781 . Ini adalah pertanyaan yang berbeda tetapi sangat membantu bagi Anda!
12

Saya menulis beberapa kode yang menyelesaikan ini, dan menambahkan tombol untuk mengaktifkan visibilitas kode.

Berikut ini masuk dalam sel kode di bagian atas buku catatan:

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)

Anda dapat melihat contoh tampilannya di NBviewer di sini .

Pembaruan: Ini akan memiliki beberapa perilaku lucu dengan sel-sel Markdown di Jupyter, tetapi berfungsi baik dalam versi ekspor HTML notebook.

Max Masnick
sumber
3
Ini bekerja pada sel kode, tetapi jika Anda memiliki sel penurunan harga itu melakukan sesuatu yang aneh. Ini menunjukkan penurunan harga sebagai penurunan harga , dan kemudian menunjukkan konten yang sama - tetapi diformat - di bawah.
Scott H
Saya baru tahu bahwa satu-satunya yang salah adalah spesifikasi node. Alih-alih '.input_area'dan '.prompt', gunakan 'div.input'dan itu berfungsi seperti pesona! Jadi untuk rekap, pengganti jQuery("div.input").toggle();di tempat jQuery('.input_area').toggle(); jQuery('.prompt').toggle();. @ Max Masnick, bisakah Anda memperbaiki jawaban Anda?
Scott H
Menggunakan "div.input" sebagai pemilihan simpul berfungsi selama Anda tidak berinteraksi dengan sel markdown, tapi saya baru tahu bahwa jika Anda berinteraksi dengan sel markdown Anda mungkin mendapatkan beberapa perilaku funky. Misalnya, jika Anda mengklik dua kali sel markdown maka itu akan disembunyikan seluruhnya. Jadi apa adanya, solusi tweak saya untuk Max baik-baik saja untuk menghasilkan HTML untuk dibagikan kepada orang lain, tetapi tidak untuk kemudian berinteraksi terlalu banyak dengannya.
Scott H
Ya, jadi saya perhatikan hal yang sama yang Anda lakukan dengan sel-sel Markdown yang dibongkar. Ini berfungsi dengan baik dalam ekspor HTML, yang merupakan tempat saya menggunakannya. Saya akan mengedit jawaban untuk mencatat ini.
Max Masnick
1
Untuk menghapus sisa ruang kanan dari penghapusan ".prompt" cukup tambahkan kode ini ke akhir kode di atas. CSS = """#notebook div.output_subarea { max-width:100%;""" HTML('<style>{}</style>'.format(CSS)). Ini sangat berguna untuk mencetak.
Little Bobby Tables
10

Ini dapat dilakukan dengan menggunakan ToggleButtonwidget IPython dan sedikit JavaScript. Kode berikut harus ditempatkan ke dalam sel kode di bagian atas dokumen:

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)

Ini menciptakan tombol berikut untuk beralih menampilkan / menyembunyikan kode untuk Notebook Jupyter, default ke keadaan "sembunyikan":

Sembunyikan status kode

Ketika diatur ke "show" state, Anda kemudian dapat melihat kode untuk Notebook Jupyter:

Tunjukkan status kode

Sebagai tambahan, sementara banyak dari kode ini harus diletakkan di awal Notebook, lokasi tombol sakelar adalah opsional. Secara pribadi, saya lebih suka menyimpannya di bagian bawah dokumen. Untuk melakukannya, cukup pindahkan display(button)baris ke sel kode terpisah di bagian bawah halaman:

Tombol sakelar yang dipindahkan

Erick Shepherd
sumber
9

Ada solusi bagus yang disediakan di sini yang berfungsi dengan baik untuk notebook yang diekspor ke HTML. Situs web bahkan menghubungkan kembali ke sini untuk posting SO ini, tapi saya tidak melihat solusi Chris di sini! (Chris, kamu dimana?)

Ini pada dasarnya solusi yang sama dengan jawaban yang diterima dari harshil, tetapi memiliki keuntungan menyembunyikan kode toggle itu sendiri dalam HTML yang diekspor. Saya juga suka bahwa pendekatan ini menghindari perlunya fungsi HTML IPython.

Untuk menerapkan solusi ini, tambahkan kode berikut ke sel 'Raw NBConvert' di bagian atas buku catatan Anda:

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

Kemudian cukup ekspor notebook ke HTML. Akan ada tombol sakelar di bagian atas notebook untuk menampilkan atau menyembunyikan kode.

Chris juga memberikan contoh di sini .

Saya dapat memverifikasi bahwa ini berfungsi di Jupyter 5.0.0

Pembaruan : Juga nyaman untuk menampilkan / menyembunyikan div.promptelemen beserta div.inputelemennya. Ini menghapus In [##]:dan Out: [##]teks dan mengurangi margin di sebelah kiri.

Ken
sumber
apakah mungkin menggunakan kode ini untuk menyembunyikan secara selektif output dengan mengklik tombol? IE $('div.output').next().hide('500');untuk menyembunyikan output selanjutnya? Saya sudah mencoba sendiri tetapi tidak bisa membuatnya bekerja.
Brian Keith
7

Untuk tampilan yang lebih baik dengan dokumen cetak atau laporan, kita perlu menghapus tombol juga, dan kemampuan untuk menampilkan atau menyembunyikan blok kode tertentu. Inilah yang saya gunakan (cukup salin-tempel ini ke sel pertama Anda):

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

Lalu di sel Anda berikutnya:

hide_me
print "this code will be hidden"

dan

print "this code will be shown"
kode jay
sumber
Saya menduga ini tidak berfungsi untuk versi terbaru / python 3?
baxx
Bekerja dengan jupyter versi 4.3.0 dengan Python versi 3.6.1.
Alma Rahat
Terima kasih! Senang mengatakan bahwa ini bekerja dengan notebook Jupyter 5.3.1 juga. Saya menggunakan Python versi 3.6.1
Amitrajit Bose
4

Ini akan membuat output notebook IPython. Namun, Anda akan dapat melihat kode input. Anda dapat menyalin buku catatan, lalu menambahkan kode ini jika diperlukan untuk berbagi dengan seseorang yang tidak perlu melihat kode tersebut.

from IPython.display import HTML

HTML('''<script> $('div .input').hide()''')
Chase Wright
sumber
1
@Rocketq gunakan ini - from IPython.display import HTML HTML('''<script> $('div.input').show()''')
fixxxer
4

Konversi sel menjadi Markdown dan gunakan <details>tag HTML5 seperti pada contoh dengan 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>
Valentas
sumber
1

Berikut ini adalah solusi lain yang disarankan oleh p3trus :

$([IPython.events]).on('notebook_loaded.Notebook', function(){
    IPython.toolbar.add_buttons_group([
        {
             'label'   : 'toggle input cells',
             'icon'    : 'icon-refresh', 
             'callback': function(){$('.input').slideToggle()}
        }
    ]);
});

Seperti dijelaskan oleh p3trus : "[Ini] menambahkan tombol ke bilah alat notebook ipython untuk menyembunyikan / menampilkan sel kode input. Untuk menggunakannya, Anda harus meletakkan file custom.js di .ipython_<profile name>/static/custom/folder Anda , di mana adalah profil ipython yang digunakan. "

Komentar saya sendiri: Saya memverifikasi solusi ini dan berfungsi dengan iPython 3.1.0.

akhmed
sumber
1

Solusi yang diterima juga berfungsi di julia Jupyter / IJulia dengan modifikasi berikut:

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

perhatikan khususnya:

  • gunakan displayfungsinya
  • keluar dari $tanda (jika tidak dilihat sebagai variabel)
gozzilli
sumber
Saya bingung bagaimana cara membuatnya bekerja. Apakah diperlukan pernyataan impor dan jenis kotak apa yang harus digunakan? Yang mentah atau kotak kode?
J Spen
1

Berikut ini adalah artikel yang bagus (yang sama @Ken diposting) tentang cara memoles notebook Jpuyter (IPython baru) untuk presentasi. Ada banyak cara untuk memperluas Jupyter menggunakan JS, HTML, dan CSS, termasuk kemampuan untuk berkomunikasi dengan kernel python notebook dari javascript. Ada dekorator ajaib untuk %%HTMLdan %%javascriptAnda bisa melakukan hal seperti ini di dalam sel dengan sendirinya:

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

Saya juga bisa menjamin metode Chris bekerja di jupyter 4.XX

ThisGuyCantEven
sumber
1

Solusi yang sangat mudah menggunakan Konsol peramban. Anda menyalin ini ke konsol browser Anda dan tekan enter:

$("div.input div.prompt_container").on('click', function(e){
    $($(e.target).closest('div.input').find('div.input_area')[0]).toggle();
});

masukkan skrip ke konsol browser

Kemudian Anda beralih kode sel hanya dengan mengklik jumlah input sel.

nomor telepon genggam

Matěj M
sumber
0

(Kertas) Mencetak atau Menyimpan sebagai HTML

Bagi Anda yang ingin mencetak keluaran kertas, jawaban di atas saja tampaknya tidak memberikan hasil akhir yang bagus. Namun, mengambil kode @Max Masnick dan menambahkan yang berikut memungkinkan seseorang untuk mencetaknya pada halaman A4 penuh.

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

Alasan untuk indentasi adalah bahwa bagian prompt dihapus oleh Max Masnick berarti semuanya bergeser ke kiri pada output. Namun ini tidak melakukan apa pun untuk lebar maksimum output yang dibatasi max-width:100%-14ex;. Ini mengubah lebar maks dari output_subarea ke max-width:100%;.

Tabel Bobby Kecil
sumber
0

Dengan semua solusi di atas meskipun Anda menyembunyikan kode, Anda masih akan mendapatkan [<matplotlib.lines.Line2D at 0x128514278>]omong kosong di atas sosok yang mungkin tidak Anda inginkan.

Jika Anda benar-benar ingin menyingkirkan input daripada hanya menyembunyikannya, saya pikir solusi terbersih adalah menyimpan angka Anda ke disk di sel tersembunyi, dan kemudian hanya memasukkan gambar dalam sel Markdown menggunakan mis ![Caption](figure1.png).

maxymoo
sumber
3
Anda bisa membuatnya _ = plt.plot()tidak mencetaknya [<>]omong kosong
jonnybazookatone
3
Menempatkan tanda titik koma setelah perintah plot matplotlib menekan output yang tidak diinginkan untuk saya.
DakotaD
0
jupyter nbconvert testing.ipynb --to html --no-input
gocode
sumber
0
jupyter nbconvert yourNotebook.ipynb --no-input --no-prompt
Naveen Kumar
sumber
6
Harap tambahkan beberapa penjelasan daripada hanya menjawab dengan suatu perintah.
Fabian Bettag