ฉันจะบอก Matplotlib ให้สร้างพล็อต (ใหม่) ที่สองจากนั้นพล็อตที่ใหม่จะมาในภายหลังได้อย่างไร


147

ฉันต้องการพล็อตข้อมูลแล้วสร้างรูปใหม่และพล็อตข้อมูล 2 และในที่สุดก็กลับมาที่พล็อตเดิมและพล็อตข้อมูล 3 แบบนี้:

import numpy as np
import matplotlib as plt

x = arange(5)
y = np.exp(5)
plt.figure()
plt.plot(x, y)

z = np.sin(x)
plt.figure()
plt.plot(x, z)

w = np.cos(x)
plt.figure("""first figure""") # Here's the part I need
plt.plot(x, w)

FYI ฉันจะบอก matplotlib ว่าฉันทำกับพล็อตได้อย่างไร ทำสิ่งที่คล้ายกัน แต่ไม่มาก! ไม่ให้ฉันเข้าถึงพล็อตดั้งเดิมนั้น

คำตอบ:


152

หากคุณพบว่าตัวเองกำลังทำสิ่งนี้อยู่เป็นประจำคุณควรตรวจสอบส่วนต่อประสานเชิงวัตถุกับ matplotlib ในกรณีของคุณ:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(5)
y = np.exp(x)
fig1, ax1 = plt.subplots()
ax1.plot(x, y)
ax1.set_title("Axis 1 title")
ax1.set_xlabel("X-label for axis 1")

z = np.sin(x)
fig2, (ax2, ax3) = plt.subplots(nrows=2, ncols=1) # two axes on figure
ax2.plot(x, z)
ax3.plot(x, -z)

w = np.cos(x)
ax1.plot(x, w) # can continue plotting on the first axis

มันเป็น verbose อีกเล็กน้อย แต่ก็ชัดเจนและง่ายกว่าในการติดตามโดยเฉพาะกับตัวเลขจำนวนมากแต่ละอันมีหลาย subplots


2
ฉันชอบวิธีการเชิงวัตถุเมื่อฉันคาดหวังว่าจะมีตัวเลขจำนวนมากมันจะง่ายต่อการติดตามพวกเขาโดยใช้ชื่อแทนที่จะเป็นตัวเลข ขอบคุณ!
Peter D

1
แต่จะเปลี่ยนป้ายและแกนได้อย่างไรด้วยวิธีนี้ ถ้าฉันใช้ax1.ylabelมันบอกว่ามันไม่พบ เช่นเดียวกันกับfig1.ylabel...
George Datseris

3
@GeorgeDatseris ไวยากรณ์แตกต่างกันเล็กน้อย มันax1.set_xlabel("your x label"), และax1.set_ylabel("your y label") ax1.set_title("your title")
simonb

1
ทำไมคุณถึงใช้ 111
Yash Sodha

2
@yashSodha - นั่นเป็นข้อกำหนดสไตล์ MATLAB ของจำนวนย่อย (แถว, คอลัมน์, ดัชนี) plt.subplots(nrows, ncols)แต่มันเป็นเรื่องง่ายมากในขณะนี้กับการใช้งาน ได้อัปเดตตัวอย่าง
simonb

120

เมื่อคุณโทรหาคุณfigureเพียงกำหนดหมายเลขพล็อต

x = arange(5)
y = np.exp(5)
plt.figure(0)
plt.plot(x, y)

z = np.sin(x)
plt.figure(1)
plt.plot(x, z)

w = np.cos(x)
plt.figure(0) # Here's the part I need
plt.plot(x, w)

แก้ไข: โปรดทราบว่าคุณสามารถกำหนดเลขแปลงได้ตามที่คุณต้องการ (ที่นี่เริ่มต้นจาก0) แต่หากคุณไม่ได้ระบุตัวเลขด้วยเมื่อคุณสร้างใหม่การกำหนดหมายเลขอัตโนมัติจะเริ่มที่1("สไตล์ Matlab" ตาม ไปที่เอกสาร)


3
ดูเหมือนว่าจะทำงานในโหมดโต้ตอบของ matplotlib ในขณะที่เมธอดรูป () ... add_subplot () ไม่ทำงาน ขอบคุณ!
chbrown

@SebMa โปรดอย่าเปลี่ยนรหัสโดยไม่เข้าใจ คำตอบนี้มีเฉพาะเกี่ยวกับการส่งหมายเลขไปfigureที่คุณลบออก สิ่งอื่น ๆ ที่คุณเปลี่ยนแปลงถูกคัดลอกมาจากโพสต์ดั้งเดิมและไม่ใช่ความผิดพลาดในคำตอบของฉัน
agf

@agf สวัสดีฉันลบ1ข้างในออกplt.figure(1)เพราะฉันคิดว่าจำนวนนั้นเพิ่มขึ้นอัตโนมัติและไม่จำเป็น ขอโทษ
SebMa

18

อย่างไรก็ตามการกำหนดหมายเลขเริ่มต้นที่1:

x = arange(5)
y = np.exp(5)
plt.figure(1)
plt.plot(x, y)

z = np.sin(x)
plt.figure(2)
plt.plot(x, z)

w = np.cos(x)
plt.figure(1) # Here's the part I need, but numbering starts at 1!
plt.plot(x, w)

นอกจากนี้หากคุณมีหลายแกนในรูปเช่น subplots ให้ใช้axes(h)คำสั่งที่hเป็นจุดจับของวัตถุแกนที่ต้องการเพื่อมุ่งเน้นไปที่แกนนั้น

(ยังไม่มีสิทธิ์แสดงความคิดเห็นขออภัยสำหรับคำตอบใหม่!)


10
0ทำงานได้การกำหนดหมายเลขอัตโนมัติเพียงแค่เริ่มต้น1ถ้าคุณไม่ให้หมายเลขเลย
agf

0

วิธีหนึ่งที่ฉันพบหลังจากการดิ้นรนคือการสร้างฟังก์ชั่นที่ได้รับ data_plot matrix ชื่อไฟล์และคำสั่งเป็นพารามิเตอร์ในการสร้าง boxplots จากข้อมูลที่ได้รับในรูปที่สั่ง (คำสั่งต่างกัน = ตัวเลขที่แตกต่างกัน) และบันทึกไว้ภายใต้

def plotFigure(data_plot,file_name,order):
    fig = plt.figure(order, figsize=(9, 6))
    ax = fig.add_subplot(111)
    bp = ax.boxplot(data_plot)
    fig.savefig(file_name, bbox_inches='tight')
    plt.close()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.