ยุบเซลล์ในสมุดบันทึก jupyter


156

ฉันใช้สมุดบันทึก ipython Jupyter สมมติว่าฉันกำหนดฟังก์ชันที่ใช้พื้นที่มากบนหน้าจอ มีวิธีทำให้เซลล์ยุบหรือไม่?

ฉันต้องการให้ฟังก์ชันยังคงทำงานและสามารถเรียกใช้ได้ แต่ฉันต้องการซ่อน / ยุบเซลล์เพื่อให้เห็นภาพในสมุดบันทึกได้ดีขึ้น ฉันจะทำเช่นนี้ได้อย่างไร?


34
ว้าวมันเป็นปี 2017 แล้วและไม่มีวิธีง่ายๆ
user1700890

34
2019 และยังคงนับ
Hardian Lawi

32
2020 ... (ตอนแรก!)
itzy

9
อ่าฉันจะเตือนความจำเพื่อให้ฉันได้เป็นคนแรกในปี 2021
มือใหม่

7
JupyterLab มีสิ่งนี้ตั้งแต่ปี 2019 ไฮไลต์เซลล์แล้วคลิกที่แถบสีฟ้าข้างๆ ตอนนี้คุณจะเห็นมันแสดงเป็นจุดสามจุด จะได้รับการเคารพเมื่อคุณบันทึกและเปิดใหม่ในภายหลังหรือที่อื่น ๆ มีคุณลักษณะเพิ่มเติมและตัวเลือกเช่นView> Collapse All Codeดูที่นี่และการเชื่อมโยงที่นี่
Wayne

คำตอบ:


103

jupyter contrib nbextensionsแพคเกจหลามมีนามสกุลรหัสพับที่สามารถเปิดใช้งานได้ภายในโน้ตบุ๊ค ไปที่ลิงค์ (Github) เพื่อดูเอกสาร

ในการติดตั้งโดยใช้บรรทัดคำสั่ง:

pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user

เพื่อให้ชีวิตง่ายขึ้นในการจัดการฉันขอแนะนำjupyter nbextensions configuratorแพ็คเกจ สิ่งนี้มีแท็บพิเศษในอินเทอร์เฟซ Notebook ของคุณซึ่งคุณสามารถ (de) เปิดใช้งานส่วนขยายที่ติดตั้งทั้งหมดได้อย่างง่ายดาย

การติดตั้ง:

pip install jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable --user

12
สิ่งดีๆแม้ว่าฉันต้องการให้ nbextension "Codefolding" พับทั้งเซลล์ไม่ใช่แค่บล็อกโค้ด
bsmith89

2
ถ้าใครวิ่งเข้าไปในปัญหาการติดตั้งกับ CONDA ลอง: แล้วpip install jupyter_contrib_nbextensions jupyter contrib nbextensions install --sys-prefix --skip-running-checkฉันหวังว่า jupyter จะมีแพ็คเกจนี้เป็นค่าเริ่มต้น
user1700890

7
เส้นทางการติดตั้งที่ง่ายที่สุดคือผ่าน CONDA ตัวเองconda install -c conda-forge jupyter_contrib_nbextensions :
Max Ghenis

3
เพียงบันทึกย่อสำหรับทุกคนที่ใช้ JupyterLab รุ่นใหม่กว่า ตามไซต์ GitHub ที่กล่าวถึงส่วนขยายเหล่านี้ทำงานใน JupyterLab ฉันสงสัยตัวเองมากจึงคิดว่าจะบอกให้คนอื่นรู้ อ้าง repo Due to major differences between the Jupyter Notebook and JupyterLab, the extensions in this repository will not work in JupyterLabGitHub:
NYCeyes

3
คุณสามารถยุบทั้งเซลล์ได้หากใส่ #comment ไว้ที่ด้านบนสุดของเซลล์ จากนั้น Jupyter จะแสดงลูกศรแบบเลื่อนลงเพื่อยุบเซลล์ทั้งหมด
EatSleepCode

35

JupyterLabรองรับการยุบเซลล์ คลิกที่แถบเซลล์สีน้ำเงินทางด้านซ้ายเพื่อพับเซลล์ ป้อนคำอธิบายภาพที่นี่


6
ไม่คงอยู่ในการส่งออก
cosmosa

มีทางออกที่ดีสำหรับเรื่องนี้หรือไม่? ฉันแย่มากที่ต้องการซ่อนเซลล์ที่ยุบเมื่อฉันส่งออก ฉันต้องการเก็บโค้ดและเอาต์พุตบางส่วนและซ่อนโค้ดและเอาต์พุตอื่น ๆ ดังนั้นฉันจึงไม่สามารถซ่อนโค้ดทั้งหมดได้ .....
Russell Richie

2
โค้ดและเอาต์พุตสามารถยุบได้ตามที่อธิบายไว้ในคำตอบนี้ นอกจากนี้ข้อมูลยังคงอยู่ มันถูกเขียนในข้อมูลเมตาของเซลล์ source_hiddenและoutputs_hiddenถูกตั้งค่า nbformat.readthedocs.io/en/latest/…
gillesB

27

คุณสามารถสร้างเซลล์และใส่รหัสต่อไปนี้:

%%html
<style>
div.input {
    display:none;
}
</style>

การเรียกใช้เซลล์นี้จะซ่อนเซลล์อินพุตทั้งหมด หากต้องการแสดงย้อนกลับคุณสามารถใช้เมนูเพื่อล้างเอาต์พุตทั้งหมด

มิฉะนั้นคุณสามารถลองใช้ส่วนขยายโน้ตบุ๊กดังต่อไปนี้:

https://github.com/ipython-contrib/IPython-notebook-extensions/wiki/Home_3x


ส่วนขยายของโน้ตบุ๊กนั้นดีจริงๆ มีอีกเป็นพวงด้วย github.com/ipython-contrib/jupyter_contrib_nbextensions
shahensha

18

ฉันมีปัญหาที่คล้ายกันและ "nbextensions" ที่ระบุโดย @Energya ก็ทำงานได้ดีและไม่ยุ่งยาก ติดตั้งคำแนะนำตรงไปตรงมา (ผมพยายามกับงูใหญ่ใน Windows) สำหรับส่วนขยายโน๊ตบุ๊คและสำหรับการปรับแต่งของพวกเขา

ที่กล่าวว่าฉันต้องการเพิ่มว่าส่วนขยายต่อไปนี้ควรเป็นที่สนใจ

  • ซ่อนอินพุต | ส่วนขยายนี้ช่วยให้สามารถซ่อนตัวแปลงสัญญาณแต่ละตัวในสมุดบันทึก สามารถทำได้โดยคลิกที่ปุ่มแถบเครื่องมือ: ซ่อนอินพุต

  • หัวเรื่องที่พับได้ | อนุญาตให้โน้ตบุ๊กมีส่วนที่ยุบได้โดยคั่นด้วยส่วนหัว หัวเรื่องที่พับได้

  • Codefolding | มีการกล่าวถึง แต่ฉันเพิ่มเพื่อความสมบูรณ์ Codefolding


10

สร้างไฟล์ custom.js ภายใน ~ / .jupyter / custom / โดยมีเนื้อหาดังต่อไปนี้:

$("<style type='text/css'> .cell.code_cell.collapse { max-height:30px; overflow:hidden;} </style>").appendTo("head");
$('.prompt.input_prompt').on('click', function(event) {
    console.log("CLICKED", arguments)   
    var c = $(event.target.closest('.cell.code_cell'))
    if(c.hasClass('collapse')) {
        c.removeClass('collapse');
    } else {
        c.addClass('collapse');
    }
});

หลังจากบันทึกแล้วให้รีสตาร์ทเซิร์ฟเวอร์และรีเฟรชโน้ตบุ๊ก คุณสามารถยุบเซลล์ใดก็ได้โดยคลิกที่ป้ายกำกับการป้อนข้อมูล (In [])


3
สิ่งนี้ไม่ได้ผลสำหรับฉันเนื่องจาก div ที่จะเปลี่ยนไม่ได้ถูกโหลดเมื่อเรียกใช้ js ที่กำหนดเอง อย่างไรก็ตามสิ่งนี้สามารถแก้ไขการตัดทุกอย่างใน setTimeout (ฟังก์ชัน () {... }, 3000);
Steohan

2
สิ่งนี้ใช้ได้ผลสำหรับฉันหลังจากเปลี่ยนบรรทัดที่ 4 เป็น: var c = $(event.target).closest('.cell.code_cell') และทำตามคำแนะนำของ Steohan เพื่อรวมทุกอย่างใน setTimeout
proteome

คุณสามารถใช้ c.toggleClass ('ยุบ'); แทนคำสั่ง if-else
gouravkr

9

ส่วนขยาย hide_code ช่วยให้คุณซ่อนเซลล์แต่ละเซลล์และ / หรือพร้อมต์ที่อยู่ข้างๆ ติดตั้งเป็น

pip3 install hide_code

ไปที่https://github.com/kirbs-/hide_code/สำหรับข้อมูลเพิ่มเติมเกี่ยวกับส่วนขยายนี้


9

ประการแรกปฏิบัติตามคำแนะนำของ Energya:

pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user
pip install jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable --user

ประการที่สองคือกุญแจสำคัญ:หลังจากเปิดสมุดบันทึก jupiter ให้คลิกแท็บ Nbextension ตอนนี้ค้นหา "colla" จากเครื่องมือค้นหาที่ให้บริการโดย Nbextension (ไม่ใช่โดยเว็บเบราว์เซอร์)จากนั้นคุณจะพบสิ่งที่เรียกว่า "Collapsible Headings"

นี่คือสิ่งที่คุณต้องการ!


4

มีคำตอบมากมายสำหรับคำถามนี้ซึ่งทั้งหมดนี้ฉันรู้สึกว่าไม่น่าพอใจ (บางส่วนมากกว่าคนอื่น ๆ ) ส่วนขยายมากมาย - การพับโค้ดการพับตามส่วนหัว ฯลฯ ฯลฯ ไม่มีใครทำในสิ่งที่ฉันต้องการด้วยวิธีที่ง่ายและมีประสิทธิภาพ ฉันรู้สึกประหลาดใจมากที่ยังไม่มีการใช้โซลูชัน (เช่นเดียวกับ Jupyter Lab)

อันที่จริงฉันไม่พอใจมากที่ได้พัฒนาส่วนขยายโน้ตบุ๊กแบบธรรมดาที่สามารถขยาย / ยุบโค้ดในเซลล์โน้ตบุ๊กได้ในขณะที่ยังคงใช้งานได้

ที่เก็บ GitHub: https://github.com/BenedictWilkinsAI/cellfolding

ด้านล่างนี้เป็นตัวอย่างเล็ก ๆ ของสิ่งที่ส่วนขยายทำ:

เพียงดับเบิลคลิกซ้ายของเซลล์โค้ดจะยุบเป็นบรรทัดเดียว:

ดับเบิลคลิกอีกครั้งจะขยายเซลล์

สามารถติดตั้งส่วนขยายได้อย่างง่ายดายด้วย pip:

pip install nbextension-cellfolding
jupyter nbextension install --py cellfolding --user
jupyter nbextension enable --py cellfolding --user 

และยังเข้ากันได้กับnbextension ปรับแต่ง ฉันหวังว่าผู้คนจะพบว่าสิ่งนี้มีประโยชน์!


2
ทำงานอย่างมีเสน่ห์ Neat
Ayan Mitra

3

ดังที่คนอื่นกล่าวถึงคุณสามารถทำได้ผ่านทาง nbextensions ฉันต้องการให้คำอธิบายสั้น ๆ เกี่ยวกับสิ่งที่ฉันทำซึ่งง่ายและรวดเร็ว:

ในการเปิดใช้งานส่วนหัวที่เข้ากันได้: ในเทอร์มินัลของคุณให้เปิดใช้งาน / ติดตั้ง Jupyter Notebook Extensions โดยป้อน:

pip install jupyter_contrib_nbextensions

จากนั้นป้อน:

jupyter contrib nbextension install

เปิด Jupyter Notebook อีกครั้ง ไปที่แท็บ "แก้ไข" แล้วเลือก "nbextensions config" ยกเลิกการทำเครื่องหมายในช่องใต้ชื่อ "nbextensions ที่กำหนดค่าได้" จากนั้นเลือก "ส่วนหัวที่ยุบได้"


สงสัยว่าทำไมไม่สามารถเข้าถึงnbextensions configได้โดยตรงจากแดชบอร์ดหลักและต้องเปิดสมุดบันทึกแทน หรือตามที่คนอื่น ๆ ได้กล่าวถึงสามารถเข้าถึงได้ผ่านทางlocalhost:8888/nbextensions(หรือพอร์ตใดก็ตามที่อยู่ในการกำหนดค่าของคุณ)
Antoine

ขอบคุณ! เป็นประโยชน์มาก ฉันสงสัยว่าจะดำเนินการอย่างไรสำหรับ jupyterlab
Mez13

1

นอกจากนี้ยังมีคำแนะนำ Pan Yan รุ่นปรับปรุง เพิ่มปุ่มที่แสดงเซลล์โค้ดกลับ:

%%html
<style id=hide>div.input{display:none;}</style>
<button type="button" 
onclick="var myStyle = document.getElementById('hide').sheet;myStyle.insertRule('div.input{display:inherit !important;}', 0);">
Show inputs</button>

หรือหลาม:

# Run me to hide code cells

from IPython.core.display import display, HTML
display(HTML(r"""<style id=hide>div.input{display:none;}</style><button type="button"onclick="var myStyle = document.getElementById('hide').sheet;myStyle.insertRule('div.input{display:inherit !important;}', 0);">Show inputs</button>"""))

2
รหัสจะซ่อนเซลล์อินพุตทั้งหมดไม่ใช่เซลล์ใดเซลล์หนึ่ง
Jack Fleeting

สิ่งที่ฉันต้องการสำหรับเอาต์พุต แต่คุณสามารถยุบ / ซ่อนเอาต์พุตทั้งหมดได้โดยการสลับในเมนู Jupyter: Cell> All Output> Toggle
เครื่องหมาย

ความอัปยศนี่เป็นทางออกเดียวที่ฉันพบว่าซ่อนรหัสตามค่าเริ่มต้นและแสดงเฉพาะเมื่อคลิกเท่านั้น น่าเสียดายที่สิ่งนี้ซ่อนเซลล์ทั้งหมดไม่ใช่แค่เป้าหมายเดียว
penelope

@penelope คุณสามารถตรวจสอบว่าเซลล์ต่างๆมีรหัสองค์ประกอบ html หรือคลาสที่ไม่ซ้ำกันหรือไม่ ถ้าใช่คุณสามารถแก้ไขคำตอบของฉันได้ คำตอบของฉันมีผลต่อเซลล์ทั้งหมดเพราะไม่ได้แยกความแตกต่างระหว่างเซลล์
Peter Zagubisalo

1

คุณไม่จำเป็นต้องทำอะไรมากนอกจากเปิดใช้งานส่วนขยาย:

http://localhost:8888/nbextensions?nbextension=collapsible_headings
http://localhost:8888/nbextensions?nbextension=codefolding/main

ป้อนคำอธิบายภาพที่นี่

เป็นไปได้มากที่สุดที่คุณจะพบส่วนขยายทั้งหมดของคุณที่นี่:

http://localhost:8888/nbextensions

ป้อนคำอธิบายภาพที่นี่


1

สิ่งที่ฉันใช้เพื่อให้ได้ผลลัพธ์ที่ต้องการคือ:

  1. บันทึกบล็อกโค้ดด้านล่างในไฟล์ที่มีชื่อtoggle_cell.pyอยู่ในไดเร็กทอรีเดียวกับสมุดบันทึกของคุณ
from IPython.core.display import display, HTML
toggle_code_str = '''
<form action="javascript:code_toggle()"><input type="submit" id="toggleButton" value="Show Sloution"></form>
'''

toggle_code_prepare_str = '''
    <script>
    function code_toggle() {
        if ($('div.cell.code_cell.rendered.selected div.input').css('display')!='none'){
            $('div.cell.code_cell.rendered.selected div.input').hide();
        } else {
            $('div.cell.code_cell.rendered.selected div.input').show();
        }
    }
    </script>

'''

display(HTML(toggle_code_prepare_str + toggle_code_str))

def hide_sloution():
    display(HTML(toggle_code_str))
  1. เพิ่มสิ่งต่อไปนี้ในเซลล์แรกของสมุดบันทึกของคุณ
from toggle_cell import toggle_code as hide_sloution
  1. เซลล์ใด ๆ ที่คุณต้องการเพิ่มปุ่มสลับเพื่อโทรออก hide_sloution()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.