Bagaimana saya memberi tahu Matplotlib untuk membuat plot kedua (baru), kemudian plot yang lama?

147

Saya ingin memplot data, lalu membuat gambar baru dan memplot data2, dan akhirnya kembali ke plot asli dan memplot data3, agak seperti ini:

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 Bagaimana saya memberi tahu matplotlib bahwa saya sudah selesai dengan plot? melakukan sesuatu yang serupa, tetapi tidak cukup! Itu tidak membiarkan saya mendapatkan akses ke plot asli itu.

Peter D
sumber

Jawaban:

152

Jika Anda menemukan diri Anda melakukan hal-hal seperti ini secara teratur, mungkin ada baiknya menyelidiki antarmuka berorientasi objek ke matplotlib. Dalam kasus Anda:

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

Ini sedikit lebih verbose tetapi jauh lebih jelas dan lebih mudah untuk dilacak, terutama dengan beberapa angka masing-masing dengan beberapa subplot.

simonb
sumber
2
Saya lebih suka pendekatan berorientasi objek karena ketika saya mengantisipasi memiliki banyak angka, akan lebih mudah untuk melacak mereka dengan menggunakan nama daripada angka. Terima kasih!
Peter D
1
Tetapi bagaimana seseorang dapat mengubah label dan batas sumbu dengan pendekatan ini. Jika saya menggunakannya ax1.ylabelmengatakan bahwa itu tidak ditemukan. Sama dengan fig1.ylabel...
George Datseris
3
@ GeorgeDatseris Sintaksnya sedikit berbeda. Ini ax1.set_xlabel("your x label"), ax1.set_ylabel("your y label"), dan ax1.set_title("your title").
simonb
1
mengapa Anda menggunakan 111?
Yash Sodha
2
@yashSodha - itu spesifikasi matlab-style dari jumlah subplot (baris, kolom, indeks). Tapi sekarang jauh lebih mudah digunakan plt.subplots(nrows, ncols). Telah memperbarui contoh.
simonb
120

Saat Anda menelepon figure, cukup beri nomor plotnya.

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)

Sunting: Perhatikan bahwa Anda dapat memberi nomor plot seperti yang Anda inginkan (di sini, mulai dari 0) tetapi jika Anda sama sekali tidak memberikan angka dengan angka ketika Anda membuat plot baru, penomoran otomatis akan dimulai pada 1("Gaya Matlab" sesuai ke dokumen).

agf
sumber
3
Tampaknya ini berfungsi dalam mode interaktif matplotlib, sedangkan metode figure () ... add_subplot () tidak. Terima kasih!
chbrown
@SebMa Tolong jangan mengubah kode tanpa memahaminya. Jawaban ini khusus tentang meneruskan nomor figureyang Anda hapus. Hal-hal lain yang Anda ubah disalin dari pos asli dan bukan kesalahan dalam jawaban saya.
Agustus
@agf Hai, saya menghapus bagian 1dalamnya plt.figure(1)karena saya pikir nomornya bertambah secara otomatis dan karenanya tidak perlu. Maaf.
SebMa
18

Namun, penomoran dimulai pada 1, jadi:

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)

Juga, jika Anda memiliki beberapa sumbu pada gambar, seperti subplot, gunakan axes(h)perintah di mana hpegangan objek sumbu yang diinginkan untuk fokus pada sumbu itu.

(belum memiliki hak komentar, maaf untuk jawaban baru!)

Ross B.
sumber
10
0berfungsi, penomoran otomatis baru mulai 1, jika Anda tidak memberikan nomor sama sekali.
agf
0

Salah satu cara yang saya temukan setelah beberapa kesulitan adalah menciptakan fungsi yang mendapatkan matriks data_plot, nama file, dan pesanan sebagai parameter untuk membuat boxplots dari data yang diberikan dalam gambar yang dipesan (urutan berbeda = angka berbeda) dan menyimpannya di bawah nama file yang diberikan.

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()
emir
sumber