我如何使用matplotlib为许多subplots制作一个单独的图例?

我正在绘制相同types的信息,但对于不同的国家,有matplotlib的多个子图。 也就是说,我有一个3×3网格上的9个地块,所有的线条都是一样的(当然,每行不同的值)。

但是,我还没有想出如何把一个图例(因为所有9个子图都有相同的行)放在图上。

我怎么做?

figlegend可能是你正在寻找的: http ://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.figlegend

示例: http : //matplotlib.org/examples/pylab_examples/figlegend_demo.html

另一个例子:

plt.figlegend( lines, labels, loc = 'lower center', ncol=5, labelspacing=0. ) 

要么:

 fig.legend( lines, labels, loc = (0.5, 0), ncol=5 ) 

你只需要问一下你的循环之外的图例。

例如,在这种情况下,我有4个子图,相同的线和一个图例。

 from matplotlib.pyplot import * ficheiros = ['120318.nc', '120319.nc', '120320.nc', '120321.nc'] fig = figure() fig.suptitle('concentration profile analysis') for a in range(len(ficheiros)): # dados is here defined level = dados.variables['level'][:] ax = fig.add_subplot(2,2,a+1) xticks(range(8), ['0h','3h','6h','9h','12h','15h','18h','21h']) ax.set_xlabel('time (hours)') ax.set_ylabel('CONC ($\mu g. m^{-3}$)') for index in range(len(level)): conc = dados.variables['CONC'][4:12,index] * 1e9 ax.plot(conc,label=str(level[index])+'m') dados.close() ax.legend(bbox_to_anchor=(1.05, 0), loc='lower left', borderaxespad=0.) # it will place the legend on the outer right-hand side of the last axes show() 

对于具有多个轴的figure中的单个图例的自动定位,如使用subplots()获得的那样,以下解决scheme非常有效:

 plt.legend( lines, labels, loc = 'lower center', bbox_to_anchor = (0,-0.1,1,1), bbox_transform = plt.gcf().transFigure ) 

使用bbox_to_anchorbbox_transform=plt.gcf().transFigure你正在定义一个新的包围盒,它的大小是作为loc的参考。 使用(0,-0.1,1,1)稍微向下移动该bouding框,以防止图例被放置在其他艺术家的上方。

OBS:在使用fig.set_size_inches()之后使用这个解决scheme,然后使用fig.tight_layout()

还有一个很好的函数get_legend_handles_labels()可以在最后一个坐标轴上调用(如果你迭代它们),它将从label=参数中收集你需要的所有东西:

 handles, labels = ax.get_legend_handles_labels() fig.legend(handles, labels, loc='upper center')