ฉันจะเปิดหน้าต่าง matplotlib แบบโต้ตอบในโน้ตบุ๊ก IPython ได้อย่างไร


125

ฉันใช้ IPython ด้วย--pylab=inlineและบางครั้งก็อยากจะเปลี่ยนไปใช้ matplotlib GUI แบบโต้ตอบที่ซูมได้เพื่อการดูพล็อต (อันที่ปรากฏขึ้นเมื่อคุณพล็อตบางอย่างในคอนโซล Python ของเทอร์มินัล) ฉันจะทำอย่างนั้นได้อย่างไร? โดยไม่ควรออกหรือรีสตาร์ทโน้ตบุ๊ก

ปัญหาเกี่ยวกับอินไลน์พล็อตในโน้ตบุ๊ก IPy คือมีความละเอียด จำกัด และฉันไม่สามารถซูมเข้าไปเพื่อดูส่วนเล็ก ๆ บางส่วนได้ ด้วย maptlotlib GUI ที่เริ่มต้นจากเทอร์มินัลฉันสามารถเลือกสี่เหลี่ยมผืนผ้าของกราฟที่ฉันต้องการขยายและแกนจะปรับตามนั้น ฉันลองทดลองกับ

from matplotlib import interactive
interactive(True)

และ

interactive(False)

แต่นั่นไม่ได้ทำอะไรเลย ฉันไม่พบคำแนะนำใด ๆ ทางออนไลน์เช่นกัน


4
อีกวิธีหนึ่งที่เป็นไปได้สำหรับปัญหาเดิมของคุณคือการเปิดใช้งานการซูมเข้าในพล็อตแบบอินไลน์ซึ่งตอนนี้ทำได้ตามที่ฉันได้อธิบายไว้ที่นี่: stackoverflow.com/a/22949003/145823
yonilevy

3
%matplotlib notebook ผลงาน
muon

คำตอบ:


140

ตามเอกสารคุณควรจะสามารถสลับไปมาได้ดังนี้:

In [2]: %matplotlib inline 
In [3]: plot(...)

In [4]: %matplotlib qt  # wx, gtk, osx, tk, empty uses default
In [5]: plot(...) 

และนั่นจะปรากฏขึ้นในหน้าต่างพล็อตปกติ (อาจจำเป็นต้องรีสตาร์ทบนโน้ตบุ๊ก)

ฉันหวังว่านี่จะช่วยได้.


2
มัน%pylab qt. ไม่ทำงานใน OS X บางทีใน Ubuntu อาจช่วยได้
metakermit

11
น่าเสียดายที่คุณไม่สามารถสลับไปมาได้ หากคุณพยายามเปลี่ยนหลังจากเริ่มต้นด้วย pylab = inline หรือ pylab = qt คุณจะได้รับ: การเรียก matplotlib.use () นี้จะไม่มีผลเนื่องจากมีการเลือกแบ็กเอนด์แล้ว matplotlib.use () ต้องถูกเรียกก่อนนำเข้า pylab, matplotlib.pyplot หรือ matplotlib.backends เป็นครั้งแรก
Charl Botha

3
ฉัน downvoted นี้เพราะมันไม่ได้ทำงานสำหรับฉันและยังคงไม่ได้ แต่เห็นได้ชัดว่านี่เป็นปัญหา 1927และมันควรจะได้รับการแก้ไขด้วยการผสาน 2179 @yarox หากคุณแก้ไขคำตอบเพื่อรวมข้อมูลนี้ฉันจะยกเลิกการลงคะแนนของฉัน
askewchan

2
ทำงานได้ดีที่นี่บน OSX เช่นกันโดยใช้ ipython v1.1.0 และ MPL 1.3.0
K. -Michael Aye

1
ใช้งานได้สำหรับฉันตอนนี้ (2014-08) โดยใช้ Python 2.7 รุ่นปัจจุบันบน Win7 x64
nerdfever.com

65

หากสิ่งที่คุณต้องการทำคือเปลี่ยนจากแผนภาพแบบอินไลน์เป็นแบบโต้ตอบและย้อนกลับ (เพื่อให้คุณสามารถแพน / ซูมได้) ควรใช้เวทย์มนตร์% matplotlib ดีกว่า

#interactive plotting in separate window
%matplotlib qt 

และกลับไปที่ html

#normal charts inside notebooks
%matplotlib inline 

% pylab magic นำเข้าสิ่งอื่น ๆ มากมายและอาจส่งผลให้เกิดความขัดแย้ง มันทำ "from pylab import *"

คุณยังสามารถใช้แบ็กเอนด์โน้ตบุ๊กใหม่ (เพิ่มใน matplotlib 1.4):

#interactive charts inside notebooks, matplotlib 1.4+
%matplotlib notebook 

หากคุณต้องการให้แผนภูมิมีการโต้ตอบมากขึ้นคุณสามารถดูที่mpld3และโบเก้โบเก้mpld3 ดีมากถ้าคุณไม่มีจุดข้อมูลจำนวนมาก (เช่น <5k +) และคุณต้องการใช้ไวยากรณ์ matplotlib ปกติ แต่มีการโต้ตอบมากกว่าเมื่อเทียบกับโน้ตบุ๊ก% matplotlib โบเก้สามารถจัดการข้อมูลจำนวนมากได้ แต่คุณต้องเรียนรู้ว่ามันเป็นไวยากรณ์เนื่องจากเป็นไลบรารีแยกต่างหาก

นอกจากนี้คุณสามารถตรวจสอบ pivottablejs (pip install pivottablejs)

from pivottablejs import pivot_ui
pivot_ui(df)

อย่างไรก็ตามการสำรวจข้อมูลเชิงโต้ตอบที่ยอดเยี่ยมคือการทำซ้ำได้โดยสิ้นเชิง มันเกิดขึ้นกับฉันดังนั้นฉันจึงพยายามใช้มันในช่วงแรก ๆ เท่านั้นและเปลี่ยนไปใช้ matplotlib / seaborn แบบอินไลน์ที่บริสุทธิ์เมื่อฉันรู้สึกได้ถึงข้อมูล


1
Warning: Cannot change to a different GUI toolkit: notebook. Using qt instead.สำหรับ%matplotlib notebook.
mLstudent33

1
ImportError: Failed to import any qt bindingสำหรับคำสั่ง qt magic
mLstudent33

31

เริ่มต้นด้วย matplotlib 1.4.0 ขณะนี้มีแบ็กเอนด์แบบโต้ตอบสำหรับใช้ในโน้ตบุ๊ก

%matplotlib notebook

มี IPython ไม่กี่เวอร์ชันที่ไม่ได้ลงทะเบียนนามแฝง แต่ทางกลับคือ:

%matplotlib nbagg

หากไม่ได้ผลให้อัปเดต IPython ของคุณ

ในการเล่นกับสิ่งนี้ goto tmpnb.org

และวาง

%matplotlib notebook

import pandas as pd
import numpy as np
import matplotlib

from matplotlib import pyplot as plt
import seaborn as sns

ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts = ts.cumsum()

df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index,
                  columns=['A', 'B', 'C', 'D'])
df = df.cumsum()
df.plot(); plt.legend(loc='best')    

ลงในเซลล์รหัส (หรือเพียงแค่แก้ไขสมุดบันทึกการสาธิต python ที่มีอยู่)


6

ทางออกที่ดีกว่าสำหรับปัญหาของคุณอาจเป็นไลบรารีแผนภูมิ ช่วยให้คุณสามารถใช้ไลบรารีจาวาสคริปต์Highcharts ที่ยอดเยี่ยมเพื่อสร้างพล็อตที่สวยงามและโต้ตอบได้ Highcharts ใช้svgแท็กHTML ดังนั้นแผนภูมิทั้งหมดของคุณจึงเป็นภาพเวกเตอร์

คุณสมบัติบางอย่าง:

  • แปลงเวกเตอร์ซึ่งคุณสามารถดาวน์โหลดได้ในรูปแบบ. png, .jpg และ. svg ดังนั้นคุณจะไม่ประสบปัญหาในการแก้ปัญหา
  • แผนภูมิแบบโต้ตอบ (ซูมสไลด์วางเมาส์เหนือจุด ... )
  • ใช้งานได้ในโน้ตบุ๊ก IPython
  • สำรวจโครงสร้างข้อมูลหลายร้อยรายการในเวลาเดียวกันโดยใช้ความสามารถในการวางแผนแบบอะซิงโครนัส

Disclaimer: ฉันเป็นผู้พัฒนาห้องสมุด


ห้องสมุดสวย ๆ ! เดี๋ยวจะลองดู :)
metakermit

ขอบคุณ! แจ้งให้เราทราบว่าคุณคิดอย่างไรกับ github และส่งปัญหาหากคุณประสบปัญหาใด ๆ :)
arnoutaertgeerts

1
แม้ว่าคำตอบนี้จะตรงประเด็น แต่ฉันก็ไม่จำเป็นต้องเรียกมันว่า "ทางออกที่ดีกว่า" นั่นคือสิ่งที่ทำให้เกิดการโหวตลดลงในอดีตซึ่งเป็นไปได้มากที่สุด
volodymyr

1
โหวตลงเนื่องจากโพสต์นี้ไม่ได้บอกฉันว่าฉันจะใช้ไลบรารีแผนภูมิเพื่อเปิดหน้าต่างพล็อตเชิงโต้ตอบได้อย่างไร
Robert Hönig

4

ฉันใช้ ipython ใน "jupyter QTConsole" จาก Anaconda ที่ www.continuum.io/downloads เมื่อ 5/28/20117

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

>>> import matplotlib.pyplot as plt

# data to plot
>>> x1 = [x for x in range(20)]

# Show in separate window
>>> %matplotlib
>>> plt.plot(x1)
>>> plt.close() 

# Show in console window
>>> %matplotlib inline
>>> plt.plot(x1)
>>> plt.close() 

# Show in separate window
>>> %matplotlib
>>> plt.plot(x1)
>>> plt.close() 

# Show in console window
>>> %matplotlib inline
>>> plt.plot(x1)
>>> plt.close() 

# Note: the %matplotlib magic above causes:
#      plt.plot(...) 
# to implicitly include a:
#      plt.show()
# after the command.
#
# (Not sure how to turn off this behavior
# so that it matches behavior without using %matplotlib magic...)
# but its ok for interactive work...

1
เมื่อฉันพยายามใช้%matplotlibฉันได้รับข้อผิดพลาดซึ่งลงท้ายด้วยImportError: No module named 'PyQt4'
user3731622

ฉันได้รับปัญหาเดียวกันกับ user3731622 สามารถทำอะไรได้บ้าง? นี่คือคำตอบส่วนใหญ่ในหน้านี้
bernando_vialli

@mkheifetz @ user3731622 คุณอาจต้องติดตั้งแพ็คเกจ: sudo apt-get install python-pyqt5หรือsudo apt-get install python-pyqt5
ttb

2

รีสตาร์ทเคอร์เนลและล้างเอาต์พุต (หากไม่ได้เริ่มต้นด้วยโน้ตบุ๊กใหม่) จากนั้นเรียกใช้

%matplotlib tk

สำหรับข้อมูลเพิ่มเติมไปที่การลงจุดด้วย matplotlib


0

คุณสามารถใช้ได้

%matplotlib qt

หากคุณได้รับข้อผิดพลาดให้ImportError: Failed to import any qt bindingติดตั้ง PyQt5 เป็น: pip install PyQt5และมันก็ใช้ได้สำหรับฉัน

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