Matplotlib'e ikinci (yeni) bir çizim oluşturmasını ve sonra daha sonra eskisine çizim yapmasını nasıl söyleyebilirim?


147

Verileri çizmek, daha sonra yeni bir şekil oluşturmak ve data2 çizmek istiyorum ve nihayet orijinal arsa ve arsa data3'e geri dönelim:

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'e bir komplo ile bittiğimi nasıl anlarım? benzer bir şey yapar, ama tam olarak değil! O orijinal arsaya erişmeme izin vermiyor.

Yanıtlar:


152

Kendinizi düzenli olarak böyle şeyler yaparken bulursanız, matplotlib için nesne yönelimli arayüzü araştırmaya değer olabilir. Senin durumunda:

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

Biraz daha ayrıntılı ama özellikle her biri birden fazla alt grafiğe sahip birkaç figürle izlenmesi çok daha net ve kolay.


2
Nesneye yönelik yaklaşımı, çok sayıda figür olmasını beklediğimde, sayılar yerine isimler kullanarak takip etmek daha kolay olacaktır. Teşekkürler!
Peter D

1
Ancak bu yaklaşımla etiket ve eksen sınırlarını nasıl değiştirebiliriz. Eğer kullanırsam ax1.ylabelbulunamadığını söyler. Aynı şey fig1.ylabel...
George Datseris

3
@GeorgeDatseris Sözdizimi biraz farklı. Bu var ax1.set_xlabel("your x label"), ax1.set_ylabel("your y label")ve ax1.set_title("your title").
simonb

1
neden 111 kullandın?
Yash Sodha

2
@yashSodha - bu, alt grafiklerin (satırlar, sütunlar, dizinler) matlab tarzı bir belirtimidir. Ama şimdi kullanımı çok daha kolay plt.subplots(nrows, ncols). Örneği güncelledik.
18'de simonb

120

Aradığınızda figure, arsa numaralandırmanız yeterlidir.

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)

Düzenleme: Grafikleri istediğiniz gibi numaralandırabileceğinizi unutmayın (buradan, buradan başlayarak 0), ancak yeni bir tane oluşturduğunuzda hiç bir rakam vermezseniz, otomatik numaralandırma 1("Matlab Style" dokümanlara).


3
Figure () ... add_subplot () yöntemi çalışmazken matplotlib'in etkileşimli modunda çalışıyor gibi görünüyor. Teşekkürler!
chbrown

@SebMa Lütfen kodu anlamadan değiştirmeyin. Bu cevap özellikle figure, kaldırdığınız bir sayıyı iletmekle ilgiliydi . Değiştirdiğiniz diğer şeyler cevabımdaki hatalardan değil, orijinal gönderiden kopyalandı.
agf

@agf Merhaba, sayının otomatik olarak arttığını ve bu nedenle gerekli olmadığını düşündüğüm için 1iç kısmı kaldırdım plt.figure(1). Afedersiniz.
SebMa

18

Ancak, numaralandırma şu 1şekilde başlar :

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)

Ayrıca, bir şekil üzerinde alt grafikler gibi birden çok eksen varsa , bu eksenlere odaklanmak için istenen eksen nesnesinin tanıtıcısı olan axes(h)komutu kullanın h.

(henüz yorum ayrıcalıklarınız yok, yeni yanıt için özür dileriz!)


10
0çalışır, otomatik numaralandırma sadece başlar 1, eğer bir sayı vermezseniz.
agf

0

Biraz uğraştıktan sonra bulduğum bir yol, sıralı şekilde verilen verilerden (farklı siparişler = farklı şekiller) boxplotlar oluşturmak ve verilen dosya_adı altında kaydetmek için data_plot matrisini, dosya adını ve sırasını parametre olarak alan bir işlev oluşturmaktır.

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()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.