วิธีการทำสมุดบันทึก IPython matplotlib แบบอินไลน์


831

ฉันกำลังพยายามใช้สมุดบันทึก IPython บน MacOS X ด้วย Python 2.7.2 และ IPython 1.1.0

ฉันไม่สามารถรับกราฟิก matplotlib เพื่อแสดงแบบอินไลน์

import matplotlib
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline  

ฉันได้ลอง%pylab inlineแล้วและอาร์กิวเมนต์บรรทัดคำสั่ง ipython --pylab=inlineแต่ก็ไม่ได้สร้างความแตกต่าง

x = np.linspace(0, 3*np.pi, 500)
plt.plot(x, np.sin(x**2))
plt.title('A simple chirp')
plt.show()

แทนที่จะเป็นกราฟิกอินไลน์ฉันได้รับสิ่งนี้:

<matplotlib.figure.Figure at 0x110b9c450>

และmatplotlib.get_backend()แสดงให้เห็นว่าฉันมี'module://IPython.kernel.zmq.pylab.backend_inline'แบ็กเอนด์


ข้อมูลโค้ดของคุณไม่ควรสร้าง<matplotlib.figure.Figure at 0x110b9c450>แต่<matplotlib.text.Text at 0x94f9320>(เพราะบรรทัดสุดท้ายของคุณกำลังพิมพ์ชื่อ) อย่างไรก็ตามโค้ดของคุณ (ที่มี% matplotlib inline และ plt.show ()) ทำงานตามที่คาดไว้ใน windows
joaquin

ขอบคุณสำหรับคำแนะนำเหล่านั้น แต่มันไม่ได้ผลสำหรับฉัน ฉันยังได้รับผลลัพธ์ข้างต้นโดยไม่มีกราฟิกอินไลน์ คุณมีคำแนะนำในการแก้ไขปัญหาหรือไม่?
Ian Fiske

ไม่มีเงื่อนงำ หลามเดียวกัน, ipython เดียวกัน (และแบ็กเอนด์เดียวกัน) แต่ใน windows และมันใช้งานได้ .... ฉันคิดว่าพล็อตจะทำงานให้คุณเมื่อไม่อินไลน์ใช่ไหม?
joaquin

2
หากปราศจาก%matplotlib inlineเคอร์เนลจะยังคงไม่ว่างอย่างถาวรและฉันจะไม่ได้ผลลัพธ์ มันจะต้องถูกฆ่า นี่กำลังพยายามใช้MacOSXแบ็กเอนด์ แต่ฉันคิดว่ามันไม่สามารถเปิดได้ด้วยเหตุผลบางอย่าง เมื่อไม่ได้ใช้โน้ตบุ๊ก ipython แบ็คเอนด์ MacOSX สำหรับ matplotlib ก็ใช้ได้ดี
Ian Fiske

1
ฉันมีอาการเหมือนกัน แต่ปรากฏว่าฉันได้ติดตั้ง Canopy รุ่น 32 บิตใน OSX 10.8 การติดตั้งใหม่ด้วยรุ่น 64 บิตได้รับการแก้ไข
Vicky T

คำตอบ:


1130

ฉันใช้%matplotlib inlineในเซลล์แรกของโน้ตบุ๊คและใช้งานได้ ฉันคิดว่าคุณควรลอง:

%matplotlib inline

import matplotlib
import numpy as np
import matplotlib.pyplot as plt

คุณยังสามารถเริ่มต้นเคอร์เนล IPython ทั้งหมดของคุณในโหมดอินไลน์ตามค่าเริ่มต้นโดยการตั้งค่าตัวเลือกการกำหนดค่าต่อไปนี้ในไฟล์ปรับแต่งของคุณ:

c.IPKernelApp.matplotlib=<CaselessStrEnum>
  Default: None
  Choices: ['auto', 'gtk', 'gtk3', 'inline', 'nbagg', 'notebook', 'osx', 'qt', 'qt4', 'qt5', 'tk', 'wx']
  Configure matplotlib for interactive use with the default matplotlib backend.

7
ฉันจะทำเครื่องหมายว่านี่เป็นคำตอบที่ถูกต้อง ตัวเลือกอื่นใช้--pylab inlineงานได้ แต่จะทักทายคุณพร้อมกับคำเตือนต่อไปนี้: ไม่แนะนำให้เริ่มต้นเมล็ดทั้งหมดในโหมด pylab และจะถูกปิดใช้งานในการเปิดตัวในอนาคต โปรดใช้เวทย์มนตร์% matplotlib เพื่อเปิดใช้งาน matplotlib แทน pylab หมายถึงการนำเข้าจำนวนมากซึ่งอาจทำให้เกิดผลข้างเคียงที่สับสนและเป็นอันตรายต่อการทำซ้ำของโน้ตบุ๊คของคุณ
mpavlov

1
@ eNord9 @mightwolf: ฉันเรียนรู้ที่จะใช้ iPython (และการเขียนโปรแกรม Python แทน Matlab); สิ่งที่ไม่import matplotlib' do versus matplotlib นำเข้าเป็น [ชื่อ] '? ให้อภัยสำหรับความคิดเห็นแบบง่ายๆ
TSGM

1
@ eNord9 @mightwolf: และสิ่งนี้เปรียบเทียบกับ `จาก matplotlib import mpl 'ได้อย่างไร
TSGM

2
@TSGM คำอธิบายที่ดีที่สุดที่ฉันเคยเห็นสำหรับคำถามของคุณคือ: effbot.org/zone/import-confusion.htm
mpavlov

ขอบคุณ @ eNord9 ฉันเพิ่งทดสอบคำสั่งของคุณเนื่องจากมันใช้เวลานานในการอัปเดตและทั้งหมด ตอนนี้ทุกอย่างทำงานได้ดีบน Python 2.7.9 และ IPython 3.1.0
Ian Fiske

216

หากเวอร์ชัน matplotlib ของคุณมีค่ามากกว่า 1.4 อาจเป็นไปได้ที่จะใช้

IPython 3.x ขึ้นไป

%matplotlib notebook

import matplotlib.pyplot as plt

รุ่นเก่ากว่า

%matplotlib nbagg

import matplotlib.pyplot as plt

ทั้งสองจะเปิดใช้งานแบ็กเอนด์ nbaggซึ่งเปิดใช้งานการโต้ตอบ

พล็อตตัวอย่างที่มีแบ็กเอนด์ nbagg


ดูเหมือนจะใช้งาน%config InlineBackend.figure_format='retina'ไม่ได้ ความคิดใด ๆ วิธีการได้รับตัวเลขเรตินาแบบโต้ตอบ?
orome

อืม ... ฉันไม่มีความเชี่ยวชาญมากเกินไปกับตัวเลขเรตินา สิ่งเดียวที่ฉันสะดุดคือลิงค์นี้แต่มันอาจเลิกใช้แล้ว หากมีคนสงสัยกันมากขึ้นฉันจะเชื่อมโยงคำถาม SO ของคุณที่นี่และขอให้คุณโชคดีกับคำตอบที่นั่น ดีที่สุด
Løiten

31
คำตอบนี้ถูกประเมินค่าน้อยเกินไป ให้การมองเห็นดีกว่า%matplotlib notebook %matplotlib inline
Hieu

9
ใช้%matplotlib notebookไม่ทำงาน (ชนิดของการแสดงบางสิ่งบางอย่างแล้วว่างเปล่า) บนโน๊ตบุ๊ค jupyter 4.1.1 / Ubuntu 16.04 / chrome %matplotlib inlineแสดงภาพ แต่พวกเขามาหลังจากข้อความ markdown ไม่ใช่ "อินไลน์" อย่างแท้จริง
ไมเคิล

6
หากคุณลอง%matplotlib inlineก่อนแล้วจึงเปลี่ยนเป็น%matplotlib notebookคุณอาจได้ผลลัพธ์ที่ว่างเปล่า รีสตาร์ทเคอร์เนลและรันอีกครั้ง
Czechnology


24

ใช้%pylab inlineคำสั่งเวทมนต์


14
ไม่: "ipython notebook --pylab inline [E 15: 01: 18.182 NotebookApp] การสนับสนุนสำหรับการระบุ --pylab บนบรรทัดคำสั่งถูกลบแล้ว [E 15: 01: 18.182 NotebookApp] โปรดใช้%pylab inlineหรือ%matplotlib inlineในสมุดบันทึกของตัวเอง "
Dave X

14

ในการทำให้ matplotlib inline เป็นค่าเริ่มต้นใน Jupyter (IPython 3):

  1. แก้ไขไฟล์ ~/.ipython/profile_default/ipython_config.py

  2. เพิ่มบรรทัด c.InteractiveShellApp.matplotlib = 'inline'

โปรดทราบว่าการเพิ่มบรรทัดนี้ไปipython_notebook_config.pyจะไม่ทำงาน มิฉะนั้นมันจะทำงานได้ดีกับ Jupyter และ IPython 3.1.0


10

ฉันต้องเห็นด้วยกับ foobarbecue (ฉันไม่มี recs เพียงพอที่จะสามารถแทรกความคิดเห็นภายใต้โพสต์ของเขา):

ตอนนี้ขอแนะนำว่าโน้ตบุ๊ค python ไม่ได้เริ่มด้วยการโต้แย้ง--pylabและตามเฟอร์นันโดเปเรซ (ผู้สร้าง ipythonnb) %matplotlib inlineควรเป็นคำสั่งเริ่มต้นโน๊ตบุ๊ค

ดูที่นี่: http://nbviewer.ipython.org/github/ipython/ipython/blob/1.x/examples/notebooks/Part%203%20-%20Plotting%20with%20Matplotlib.ipynb


7

ฉันพบวิธีแก้ปัญหาที่ค่อนข้างน่าพอใจ ฉันติดตั้งAnaconda Pythonแล้วและตอนนี้ก็ใช้ได้สำหรับฉันแล้ว


5

ฉันทำการติดตั้งแอนาคอนดา แต่ matplotlib ไม่ได้วางแผน

มันเริ่มลงจุดเมื่อฉันทำสิ่งนี้

import matplotlib
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline  

2

คุณสามารถจำลองปัญหานี้ด้วยความผิดพลาดทางไวยากรณ์ แต่%matplotlib inlineจะไม่สามารถแก้ไขปัญหาได้

ตัวอย่างแรกของวิธีที่ถูกต้องในการสร้างพล็อต ทุกอย่างทำงานได้ตามที่คาดหวังด้วยการนำเข้าและเวทย์มนตร์ที่eNord9จัดหาให้

df_randNumbers1 = pd.DataFrame(np.random.randint(0,100,size=(100, 6)), columns=list('ABCDEF'))

df_randNumbers1.ix[:,["A","B"]].plot.kde()

อย่างไรก็ตามด้วยการ()ออกจากจุดสิ้นสุดของประเภทพล็อตคุณจะได้รับข้อผิดพลาดที่ไม่ชัดเจน

รหัสผิดพลาด:

df_randNumbers1.ix[:,["A","B"]].plot.kde

ข้อผิดพลาดตัวอย่าง:

<bound method FramePlotMethods.kde of <pandas.tools.plotting.FramePlotMethods object at 0x000001DDAF029588>>

นอกเหนือจากข้อความบรรทัดเดียวนี้ไม่มีการติดตามสแต็กหรือเหตุผลที่ชัดเจนอื่น ๆ ที่คิดว่าคุณทำข้อผิดพลาดทางไวยากรณ์ พล็อตไม่พิมพ์


นี้ไม่ได้เป็นข้อผิดพลาดทางไวยากรณ์ - โดยไม่ต้อง()ไปเรียก kde , IPython จะบอกคุณในสิ่งที่kde เป็นคือวิธีการที่ถูกผูกไว้ ในความเป็นจริงจากมุมมองของ iPython นี่ไม่ใช่ "ข้อผิดพลาด" เลยดังนั้นทำไมไม่มีการติดตามสแต็ค
Kyle Strand

1
@ KyleStrand ขอบคุณ หลังจากอ่านโพสต์ของฉันอีกครั้งสิ่งที่ฉันควรจะพูดคือ: "ฉันคิดว่าฉันมีปัญหาที่จะไม่ให้แปลงแสดงแบบอินไลน์โดยใช้%matplotlib inlineคำสั่งจริง ๆ ฉันแค่ลืมใส่ () ที่ส่วนท้ายของพล็อตประเภทดังนั้นถ้า ทุกอย่างล้มเหลวให้ดูที่วงเล็บของคุณเพื่อหาข้อผิดพลาด
Blake M

1

ฉันมีปัญหาเดียวกันเมื่อฉันเรียกใช้คำสั่งการวางแผนในเซลล์ที่แยกต่างหากใน Jupyter:

In [1]:  %matplotlib inline
         import matplotlib
         import matplotlib.pyplot as plt
         import numpy as np
In [2]:  x = np.array([1, 3, 4])
         y = np.array([1, 5, 3])
In [3]:  fig = plt.figure()
         <Figure size 432x288 with 0 Axes>                      #this might be the problem
In [4]:  ax = fig.add_subplot(1, 1, 1)
In [5]:  ax.scatter(x, y)
Out[5]:  <matplotlib.collections.PathCollection at 0x12341234>  # CAN'T SEE ANY PLOT :(
In [6]:  plt.show()                                             # STILL CAN'T SEE IT :(

ปัญหาได้รับการแก้ไขโดยการรวมคำสั่งการวางแผนลงในเซลล์เดียว:

In [1]:  %matplotlib inline
         import matplotlib
         import matplotlib.pyplot as plt
         import numpy as np
In [2]:  x = np.array([1, 3, 4])
         y = np.array([1, 5, 3])
In [3]:  fig = plt.figure()
         ax = fig.add_subplot(1, 1, 1)
         ax.scatter(x, y)
Out[3]:  <matplotlib.collections.PathCollection at 0x12341234>
         # AND HERE APPEARS THE PLOT AS DESIRED :)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.