我只是以“正确”的方式开始使用Matplotlib。我正在编写各种程序,每个程序都可以给我一个时间序列,并且我希望叠加各种时间序列的图形,如下所示:
我认为我想要的是在主函数中定义的单个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
。
答案 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)
您现在可以通过更改plot
将labels
命令放入一个循环中。您仍然可以使用ax
手柄来修改/定义绘图参数。