Matplotlib:同一图形上的多个图例
我有几个绘图函数,它们接收不同类型的数据并进行绘制,每个函数都有自己的标题和图例。但是,当我尝试把它们绘制在同一个图上时,之前的图会被覆盖掉。
我知道一种方法是使用 get_artist()
,不过因为图例是在函数内部创建的,所以这似乎行不通。有没有什么方法,比如 LegendHandler
,可以用来获取每个图的图例并把它们显示在同一个图上?我是否应该从每个函数中返回图例呢?
以下是我代码的简化版本:
def plot_1(fig, data, ax = None):
if ax = None:
ax = fig.add_subplot(111)
ax.plot(data)
ax.set_xlabel('t')
plt.axis('tight')
# Create a legend
colors = {'A':'blue',
'B':'yellow',
'C':'red'}
legend_labels = []
legend_handles = []
for key in colors.keys():
legend_labels.append(key)
p = matplotlib.patches.Rectangle((0, 0), 1, 1, fc = colors[key], alpha = 0.5)
legend_handles.append(p)
ax.legend(legend_handles, legend_labels, loc='center left', bbox_to_anchor=(1, 0.5))
def plot_2(fig, data, ax = None):
if ax = None:
ax = fig.add_subplot(111)
ax.plot(data, color='green', linewidth=1, label='L1')
ax.set_xlabel('t')
ax.autoscale()
ax.legend()
def main():
plot_1(fig, data = data1)
plot_2(fig, data = data2)
我不确定这是否是最好的做法,但因为我多次使用这些绘图模型,我觉得必须保持它们的函数形式。
评论中的说明:
- matplotlib: 2 different legends on same graph 是我提到
get_artist
的原因,这在那个讨论中提到过。实际上,我现在已经用这个解决了问题,但我在寻找一种更简洁的方法来处理这个特定的情况。目前我所做的就是从每个函数中返回一个legend
,并按照那个讨论中的建议去做。
2 个回答
0
我现在已经用那个 [
add_artist
] 解决了这个问题,但我在寻找更简单的方法。
其实没有更简单的方法。
每个坐标轴对象(每个子图)都有一个 .legend_
属性,最开始是设置为 None
,之后每次使用 ax.legend(...)
或 plt.legend(...)
时,这个属性会被更新,而且是直接修改的。
你唯一能做的就是给第一个图例的艺术家(legend Artist)命名,当它从坐标轴的命名空间中移除时,也就是从 ax.legend_
中移除,你必须再用 ax.add_artist(...)
把它放回去。
至于为什么 Matplotlib 是这样设计的,我想问问 MATLAB 的设计者,不过我可能错了 :-)
0
让你的函数返回图例
def plot_2(fig, data, ax = None):
....
return ax.legend()
然后你可以这样做
legend1 = plot_1(fig, data = data1)
plot_2(fig, data = data2)
pyplot.gca().add_artist(legend1)
正如这里所建议的: matplotlib: 在同一图表上显示两个不同的图例