ฉันจะรับหลาย ๆ subplots ใน matplotlib ได้อย่างไร?


156

ฉันสับสนเล็กน้อยเกี่ยวกับวิธีการทำงานของรหัสนี้:

fig, axes = plt.subplots(nrows=2, ncols=2)
plt.show()

มะเดื่อและแกนทำงานในกรณีนี้อย่างไร มันทำอะไร?

ทำไมงานนี้ถึงไม่ทำแบบเดียวกัน:

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

1
ในฐานะของ matplotlib 2.1 ที่สองรหัสงาน
แฟร์ Paradox Fermi

คำตอบ:


210

มีหลายวิธีที่จะทำ subplotsวิธีการสร้างรูปพร้อมกับย่อย ๆ ที่เก็บไว้จากนั้นในaxอาร์เรย์ ตัวอย่างเช่น:

import matplotlib.pyplot as plt

x = range(10)
y = range(10)

fig, ax = plt.subplots(nrows=2, ncols=2)

for row in ax:
    for col in row:
        col.plot(x, y)

plt.show()

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

อย่างไรก็ตามบางอย่างเช่นนี้จะใช้งานได้ แต่ก็ไม่ "สะอาด" ถึงแม้ว่าคุณจะสร้างรูปที่มีรูปแบบย่อยแล้วเพิ่มที่ด้านบน:

fig = plt.figure()

plt.subplot(2, 2, 1)
plt.plot(x, y)

plt.subplot(2, 2, 2)
plt.plot(x, y)

plt.subplot(2, 2, 3)
plt.plot(x, y)

plt.subplot(2, 2, 4)
plt.plot(x, y)

plt.show()

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


4
แทนที่จะให้plot(x, y)พล็อตของฉันมาจากฟังก์ชันที่ผู้ใช้กำหนดเองซึ่งสร้างกราฟด้วย networkx วิธีใช้งาน
Sigur

เป็นไปได้ไหมที่จะสร้างหลาย ๆ subplots โดยไม่มี for-loop เช่นวิธีการแก้ปัญหาแบบเวกเตอร์เพื่อวางแผนข้อมูลหลายคอลัมน์ในแปลงแยกกันหรือไม่? ง่ายมากกับ ggplot ใน R แต่ดูเหมือนว่าเป็นไปไม่ได้กับ Python
user2739472

3
คุณสามารถลดการวนaxn = ax.flatten()for axes in axn: axes.plot(x,y)
ซ้ำ

@ wander95 ขอบคุณคำตอบนี้ใช้งานไม่ได้สำหรับ col = 1 หรือแถว = 1 โดยที่คุณไม่ต้องใช้
Gulzar

48
import matplotlib.pyplot as plt

fig, ax = plt.subplots(2, 2)

ax[0, 0].plot(range(10), 'r') #row=0, col=0
ax[1, 0].plot(range(10), 'b') #row=1, col=0
ax[0, 1].plot(range(10), 'g') #row=0, col=1
ax[1, 1].plot(range(10), 'k') #row=1, col=1
plt.show()

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


1
ฉันจะได้รับสิ่งที่axเป็น figแต่ไม่ใช่สิ่งที่เป็น พวกเขาคืออะไร
Leevo

3
ขวานเป็นอาร์เรย์ที่มีค่ามาก รูปที่เป็นmatplotlib.figure.Figureคลาสที่คุณสามารถทำการจัดการกับรูปที่พล็อตได้ ตัวอย่างเช่นคุณสามารถเพิ่ม colorbar ให้กับแผนย่อยเฉพาะคุณสามารถเปลี่ยนสีพื้นหลังที่อยู่เบื้องหลังแผนการย่อยทั้งหมด คุณสามารถแก้ไขโครงร่างของแผนย่อยเหล่านี้หรือเพิ่มขวานเล็ก ๆ ใหม่ให้พวกเขา โดยเฉพาะอย่างยิ่งคุณอาจต้องการชื่อหลักเดียวสำหรับแผนการย่อยทั้งหมดซึ่งสามารถรับได้ผ่านfig.suptitle(title)วิธีการ ในที่สุดเมื่อคุณพอใจกับเนื้อเรื่องแล้วคุณสามารถบันทึกโดยใช้fig.savefigวิธีการ @Leevo
Khalil Al Hooti

21
  • คุณสามารถคลายแกนในการโทรย่อยได้

  • และตั้งค่าว่าคุณต้องการแบ่งปันแกน x และ y ระหว่างแผนการย่อยหรือไม่

แบบนี้:

import matplotlib.pyplot as plt
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, sharex=True, sharey=True)
ax1.plot(range(10), 'r')
ax2.plot(range(10), 'b')
ax3.plot(range(10), 'g')
ax4.plot(range(10), 'k')
plt.show()

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


14

คุณอาจสนใจในความจริงที่ว่า matplotlib เวอร์ชั่น 2.1 โค้ดที่สองจากคำถามใช้งานได้ดีเช่นกัน

จากบันทึกการเปลี่ยนแปลง :

คลาสรูปตอนนี้มีเมธอด subplots คลาสรูปตอนนี้มีเมธอด subplots () ซึ่งทำงานเหมือนกับ pyplot.subplots () แต่อยู่ในรูปที่มีอยู่

ตัวอย่าง:

import matplotlib.pyplot as plt

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

plt.show()

ฉันได้รับ: AttributeError Traceback (โทรล่าสุดครั้งล่าสุด) <ipython-input-168-ed25aa5255fa> ใน <module> () 2 3 fig = plt.figure () ----> 4 แกน = fig.subplots (nrows = 2 , ncols = 2) AttributeError: 'รูป' วัตถุไม่มีแอตทริบิวต์ 'subplots'
Ludo Schmidt

1
@LudoSchmidt คำตอบบอกว่า "เป็นของ matplotlib เวอร์ชั่น 2.1 ... "
ImportanceOfBeingErnest

11

อ่านเอกสารประกอบ: matplotlib.pyplot.subplots

pyplot.subplots()ส่งคืน tuple fig, axซึ่งไม่ได้คลายแพ็กในสองตัวแปรโดยใช้รูปแบบ

fig, axes = plt.subplots(nrows=2, ncols=2)

รหัส

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

ไม่ได้เพราะsubplots()เป็นฟังก์ชั่นในไม่ได้เป็นสมาชิกของวัตถุpyplotFigure

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