簡體   English   中英

Matplotlib:將線收集到同一軸上

[英]Matplotlib: collecting lines onto the same axis

我只是以“正確”的方式開始使用Matplotlib。 我正在編寫各種程序,每個程序都可以給我一個時間序列,並且我希望疊加各種時間序列的圖形,如下所示:

在此處輸入圖片說明

我認為我想要的是在主函數中定義的單個Axes實例,然后調用每個小函數,它們都返回Line2D實例,然后將它們全部放入我創建的Axes對象中。

但是我在獲取現有的Line2D對象並將其添加到現有的Axes對象時遇到了麻煩(就像我想對函數的輸出進行處理一樣。)我想到了一個名為aLine2D並說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)

您現在可以通過更改labelsplot命令置於循環中。 您仍然可以使用ax來修改/定義繪圖參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM