ฉันจะรับแผนโต้ตอบอีกครั้งใน Spyder / IPython / matplotlib ได้อย่างไร


92

ฉันอัปเกรดจาก Python (x, y) 2.7.2.3 เป็น2.7.6.0ใน Windows 7 (และดีใจที่เห็นว่าในที่สุดฉันก็สามารถพิมพ์function_name?และดู docstring ใน Object Inspector ได้อีกครั้ง) แต่ตอนนี้การพล็อตไม่ได้ผล เคย.

ก่อนหน้านี้ (Spyder 2.1.9, IPython 0.10.2, matplotlib 1.2.1) ตัวอย่างเช่นเมื่อฉันลงจุดสคริปต์นี้มันจะพล็อตพล็อตย่อยเคียงข้างกันในหน้าต่างโต้ตอบ:

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

ตอนนี้ (Spyder 2.2.5, IPython 1.2.0, Matplotlib 1.3.1) เมื่อฉันพยายามพล็อตสิ่งต่าง ๆ มันจะทำพล็อตย่อยเป็น PNG แบบอินไลน์เล็ก ๆ ซึ่งเป็นการเปลี่ยนแปลงใน IPython :

PNGs แบบอินไลน์เล็ก ๆ

ดังนั้นฉันจึงเข้าไปในตัวเลือกและพบสิ่งนี้:

ตัวเลือกกราฟิก

ซึ่งดูเหมือนจะบอกว่าฉันสามารถเอาแผนโต้ตอบแบบเก่ากลับมาได้โดยมี 4 พล็อตย่อยที่แสดงเคียงข้างกัน แต่เมื่อฉันเปลี่ยนเป็น "อัตโนมัติ" และพยายามที่จะพล็อตบางอย่าง ไม่มีพล็อตเลย

ถ้าฉันเปลี่ยนดรอปดาวน์นี้เป็น Qt หรือยกเลิกการเลือก "เปิดใช้งานการสนับสนุน" ระบบจะลงพล็อตย่อยแรกหรือบางส่วนเท่านั้นจากนั้นจะหยุด:

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

ฉันจะรับพฤติกรรมเก่า ๆ ของ 4 พล็อตย่อยเคียงข้างกันในรูปเดียวที่ฉันสามารถโต้ตอบได้อย่างไร


ฉันคิดว่านี่ควรเป็นรายงานข้อผิดพลาดของ pythonxy การคาดเดาที่ไร้เดียงสาของฉันคือพวกเขาใช้ pyplot เพื่อจัดการทุกอย่างที่นั่นวางแผนและถูกกัดที่ก้น (ซึ่งดูเหมือนจะผิดเพราะพวกเขามีวิดเจ็ต qt ของตัวเอง)
tacaswell

1
@tcaswell "พวกเขา" คือใครและพวกเขาจะใช้อะไรแทน pyplot?
endolith

1
คุณสามารถสร้างปัญหานี้ซ้ำนอก pythonxy ได้หรือไม่ (เพียงใช้ ipython + qtconsole แบบตรง) มีข้อมูลไม่เพียงพอที่จะแยกแยะว่าเกิดอะไรขึ้น
tacaswell

1
ฉันเดาว่ามันเป็นบั๊กใน Spyder (Spyder คือ IDE, pythonxy คือการกระจาย)
Thomas K

1
@tcaswell: อ๊าาา. ดูเหมือนว่าสคริปต์ของฉันสร้างข้อผิดพลาด matplotlib ซึ่งจะถูกส่งไปที่อื่นที่ไม่ใช่คอนโซล IPython พวกเขาจะปรากฏขึ้นหากฉันใช้คอนโซล Qt แทนและตอนนี้ฉันมองหามันก็ปรากฏในแท็บคอนโซลปกติของ Spyder ถ้าฉันสร้างสคริปต์ที่เรียบง่ายขึ้นมันจะใช้งานได้ไม่ว่าจะเป็นสถานะเครื่องหรือเชิงวัตถุ ฉันคิดว่าฉันต้องเปลี่ยนการตั้งค่า IPython เนื่องจากพล็อตอินไลน์ใหม่
endolith

คำตอบ:


136

เปลี่ยนแบ็กเอนด์เป็นอัตโนมัติ:

เครื่องมือ> ค่ากำหนด> คอนโซล IPython> กราฟิก> แบ็กเอนด์กราฟิก> แบ็กเอนด์: อัตโนมัติ

จากนั้นปิดและเปิด Spyder


27
การปิดและเปิดเป็นสิ่งที่จำเป็นอย่างยิ่ง แค่สงสัยว่าทำไมถึงไม่ใช่ค่าเริ่มต้น
Mathias711

5
นอกจากนี้สำหรับใครก็ตามที่ยังไม่เห็นแผนการของพวกเขา (เช่นฉันไม่ได้เป็น) หน้าต่างพล็อตอาจปรากฏขึ้น _behind_ หน้าต่างคอนโซลของคุณอย่างเงียบ ๆ (อย่างน้อยก็ใน Spyder บน Windows 10) ดังนั้นคุณอาจต้องตามหาหน้าต่างของคุณ
Joshua Glazer

3
สำหรับผู้ที่มีปัญหาในการค้นหาสิ่งนี้อยู่ที่python > preferences > IPython console > Graphics > Graphics backend > Backend: Automatic
cameronroytaylor

6
แทนที่จะรีสตาร์ท Spyder คุณสามารถรีสตาร์ทเคอร์เนลได้ (โดยคลิกที่วงล้อการตั้งค่าในคอนโซลจากนั้น "รีสตาร์ทเคอร์เนล" หรือผ่านแป้นพิมพ์ลัด (บน Mac Cmd +)
Michael

ฉันไม่รู้ว่าทำไม แต่การเปลี่ยนเป็นอัตโนมัติรีสตาร์ท Spyder จากนั้นเปลี่ยนกลับเป็น Inline ทำให้พล็อตอินไลน์เริ่มแสดงเมื่อใดก็ตามที่ฉันออกคำสั่งอินพุตในลูป สิ่งนี้มีประโยชน์มาก!
Josiah Yoder

51

คุณสามารถควบคุมสิ่งนี้ได้อย่างรวดเร็วโดยพิมพ์คำสั่งวิเศษในตัวในคอนโซล IPython ของ Spyder ซึ่งฉันพบว่าเร็วกว่าการเลือกสิ่งเหล่านี้จากเมนูการตั้งค่า การเปลี่ยนแปลงจะมีผลทันทีโดยไม่จำเป็นต้องรีสตาร์ท Spyder หรือเคอร์เนล

หากต้องการเปลี่ยนเป็นแปลง "อัตโนมัติ" (เช่นโต้ตอบ) ให้พิมพ์:

%matplotlib auto

จากนั้นหากคุณต้องการเปลี่ยนกลับเป็น "อินไลน์" ให้พิมพ์สิ่งนี้:

%matplotlib inline

(หมายเหตุ: คำสั่งเหล่านี้ใช้ไม่ได้ในคอนโซลที่ไม่ใช่ IPython)

ดูความเป็นมาเพิ่มเติมเกี่ยวกับหัวข้อนี้: วัตถุประสงค์ของ "% matplotlib inline"


ใน Python 3.6 ฉันได้รับmatplotlib inline File "<stdin>", line 1 %matplotlib inline ^ SyntaxError: invalid syntax
Karlo

2
@Karlo คาดว่าจะเกิดข้อผิดพลาดจากล่าม "python" ทั่วไป ไวยากรณ์นี้ใช้ได้กับ ipython หรือ Spyder เท่านั้น
Mike T

ตกลงฉันใช้มันใน Spyder แต่อยู่ในคอนโซล Python อันที่จริงมันใช้งานได้ในคอนโซล IPython
Karlo

3
มีวิธีตั้งค่าโดยใช้สคริปต์หรือไม่? คือการเลือกผลลัพธ์ของกราฟภายในสคริปต์คืออะไร? ขอบคุณ.
Royi

1
ดูเหมือนว่าจะไม่ทำงานใน Spyder แม้ว่าจะเป็นวิธีการทำในหน้าต่าง IPython ปกติก็ตาม การใช้การตั้งค่าเมนูเหมาะสำหรับฉัน ไม่แน่ใจว่าทำไมถึงไม่เป็นเช่นนั้น
เต่าน่ารัก

10

หลังจากใช้: เครื่องมือ> ค่ากำหนด> กราฟิก> แบ็กเอนด์> อัตโนมัติ เพียงรีสตาร์ทเคอร์เนล ป้อนคำอธิบายภาพที่นี่

และคุณจะได้รับ Interactive Plot อย่างแน่นอน Happy Coding!


5

ตามที่กล่าวไว้ในความคิดเห็นปัญหาอยู่ที่สคริปต์ของคุณ จริงๆแล้วมี 2 ปัญหา:

  • มีข้อผิดพลาด matplotlib ฉันเดาว่าคุณกำลังส่งอาร์กิวเมนต์Noneอยู่ที่ไหนสักแห่ง อาจเกิดจากการผิดนัดชำระหนี้?
  • คุณโทรshow()ตามแต่ละแผนย่อย show()ควรเรียกหนึ่งครั้งในตอนท้ายของสคริปต์ของคุณ อีกทางเลือกหนึ่งคือการใช้โหมดโต้ตอบค้นหาionในเอกสารของ matplotlib

2

นี่เป็นเรื่องง่ายที่จะแก้ไขและไม่ต้องใช้การเข้ารหัสใด ๆ :

1. คลิกที่แท็บ Plots เหนือคอนโซล 2. จากนั้นที่มุมขวาบนของหน้าจอแปลงคลิกที่ปุ่มตัวเลือก 3. สุดท้ายให้ยกเลิกการเลือกปุ่ม "ปิดเสียงการพล็อตแบบอินไลน์"

ตอนนี้เรียกใช้สคริปต์ของคุณอีกครั้งและกราฟของคุณควรปรากฏในคอนโซล

ไชโย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.