Matplotlib:将线收集到同一轴上

时间:2018-07-31 22:47:19

标签: python matplotlib

我只是以“正确”的方式开始使用Matplotlib。我正在编写各种程序,每个程序都可以给我一个时间序列,并且我希望叠加各种时间序列的图形,如下所示:

enter image description here

我认为我想要的是在主函数中定义的单个Axes实例,然后调用我的每个小函数,它们都返回一个Line2D实例,然后放入它们都放在我创建的Axes对象上。

但是我在处理现有的Line2D对象并将其添加到现有的Axes对象时遇到了麻烦(就像我想对函数的输出进行操作一样。)名为Line2D的{​​{1}}并说a

ax.add_line(a)

给我一​​个RuntimeError:“不能将一个艺术家放在一个以上的图中。”

我猜测随着时间的流逝,Matplotlib不再希望用户能够将给定的行添加到他们想要的任何import matplotlib.pyplot as plt a, = plt.plot([1,2,3], [3,4,5], label = 'a') fig, ax = plt.subplots() ax.add_line(a) 中。 this答案的注释中讨论了类似的问题,除了它们在两个不同的Axes对象中谈论Axes对象。

完成我想要的最好的方法是什么?我宁愿保持我的主脚本整洁,也不想一遍又一遍地重复Figure

2 个答案:

答案 0 :(得分:1)

实际上,您不能将同一位艺术家添加到多个轴或图形上。 但是从您的问题中我了解到,这并不是必须的。

所以让我们按照您的建议去做吧;

  

“我想到了一个名为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 would recommend的方式是创建将轴作为输入并绘制到该轴的函数。

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

答案 1 :(得分:0)

可能会解决您的问题:

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)

您现在可以通过更改plotlabels命令放入一个循环中。您仍然可以使用ax手柄来修改/定义绘图参数。