[英]Matplotlib: collecting lines onto the same axis
我只是以“正確”的方式開始使用Matplotlib。 我正在編寫各種程序,每個程序都可以給我一個時間序列,並且我希望疊加各種時間序列的圖形,如下所示:
我認為我想要的是在主函數中定義的單個Axes
實例,然后調用每個小函數,它們都返回Line2D
實例,然后將它們全部放入我創建的Axes
對象中。
但是我在獲取現有的Line2D
對象並將其添加到現有的Axes
對象時遇到了麻煩(就像我想對函數的輸出進行處理一樣。)我想到了一個名為a
的Line2D
並說ax.add_line(a)
。
import matplotlib.pyplot as plt
a, = plt.plot([1,2,3], [3,4,5], label = 'a')
fig, ax = plt.subplots()
ax.add_line(a)
給我一個RuntimeError:“不能將一個藝術家放在一個以上的圖中。”
我猜測,隨着時間的推移Matplotlib已經停止希望用戶能夠在給定的行添加到任何Axes
他們想要的。 在此答案的注釋中討論了類似的問題,除了他們在談論兩個不同的Figure
對象中的Axes
對象。
完成我想要的最好的方法是什么? 我寧願保持我的主腳本整潔,也不想ax.plot(some_data)
說ax.plot(some_data)
。
實際上,您不能將同一位藝術家添加到多個軸或圖形上。 但是對於我從您的問題中了解到的,這並不是真正必要的。
因此,讓我們按照您的建議進行操作即可;
“我想到了一個名為a的Line2D,然后說ax.add_line(a)。”
import numpy as np
import matplotlib.pyplot as plt
def get_line(label="a"):
return plt.Line2D(np.linspace(0,1,10), np.random.rand(10), label = label)
fig, ax = plt.subplots()
ax.add_line(get_line(label="a"))
ax.add_line(get_line(label="b"))
ax.add_line(get_line(label="z"))
ax.legend()
plt.show()
matplotlib 推薦的方式是創建將軸作為輸入並繪制到該軸的函數。
import numpy as np
import matplotlib.pyplot as plt
def plot_line(ax=None, label="a"):
ax = ax or plt.gca()
line, = ax.plot(np.linspace(0,1,10), np.random.rand(10), label = label)
return line
fig, ax = plt.subplots()
plot_line(ax, label="a")
plot_line(ax, label="b")
plot_line(ax, label="z")
ax.legend()
plt.show()
解決您的問題的可能方法:
import matplotlib.pyplot as plt
x = np.array([1,2,3])
y = np.array([3,4,5])
label = '1'
def plot(x,y,label):
a, = plt.plot(x,y, label = label)
return a
fig, ax = plt.subplots()
plot(x,y,label)
plot(x,1.5*y,label)
您現在可以通過更改labels
將plot
命令置於循環中。 您仍然可以使用ax
來修改/定義繪圖參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.