所有子图的全局图例

时间:2016-08-26 11:05:42

标签: python matplotlib subplot

我创建了一个n x n matplot子图矩阵,它包含相同类型的曲线(让我们将它们命名为signal1和signal2):

n=5
f, axarr = plt.subplots(n,n)
for i,signal_generator in enumerate(signal_generators):
  y=i%n
  x=(i-y)/n
  axarr[x, y].plot(signal_generator.signal1)
  axarr[x, y].plot(signal_generator.signal2)

由于每个子图中的2个信号各自代表相同的类型,我想使用带有两个条目的数字全局图例' signal1' ' signal2'而不是将相同的图例附加到每个子图。

我该怎么做?

1 个答案:

答案 0 :(得分:6)

一种方法是在地块下方施加一些额外的空间。然后你可以在那里适应传奇,并拥有一个"全球"图例

import matplotlib.pyplot as plt
import numpy as np

plt.close('all')

fig, axlist = plt.subplots(3, 3)
for ax in axlist.flatten():
    line1, = ax.plot(np.random.random(100), label='data1')
    line2, = ax.plot(np.random.random(100), label='data2')
    line3, = ax.plot(np.random.random(100), 'o', label='data3')

fig.subplots_adjust(top=0.9, left=0.1, right=0.9, bottom=0.12)  # create some space below the plots by increasing the bottom-value
axlist.flatten()[-2].legend(loc='upper center', bbox_to_anchor=(0.5, -0.12), ncol=3)
# it would of course be better with a nicer handle to the middle-bottom axis object, but since I know it is the second last one in my 3 x 3 grid...

fig.show()

现在,在第二个最后一个(底部中间)轴区域下面会有一个标签,这要归功于bbox_to_anchor=(x, y)具有负y值。根据您拥有的不同子​​图的数量,以及您在每个子图中绘制的线的数量,最好保持对不同线对象的正确跟踪。也许可以将它们附加到列表中。

对我来说,输出数字看起来像是

enter image description here

这会让你想要你想要的吗?