我绘制了相同类型的信息,但针对不同的国家,使用Matplotlib绘制了多个子图。也就是说,我在一个3x3网格上有9个图,所有的线都是相同的(当然,每条线的值不同)。
然而,我还没有弄清楚如何将一个图例(因为所有九个子图都有相同的线条)放在图形上一次。
我怎么做呢?
我绘制了相同类型的信息,但针对不同的国家,使用Matplotlib绘制了多个子图。也就是说,我在一个3x3网格上有9个图,所有的线都是相同的(当然,每条线的值不同)。
然而,我还没有弄清楚如何将一个图例(因为所有九个子图都有相同的线条)放在图形上一次。
我怎么做呢?
当前回答
Figlegend可能就是您要找的:matplotlib.pyplot.figlegend
一个例子是在图图例演示。
另一个例子:
plt.figlegend(lines, labels, loc = 'lower center', ncol=5, labelspacing=0.)
Or:
fig.legend(lines, labels, loc = (0.5, 0), ncol=5)
其他回答
Figlegend可能就是您要找的:matplotlib.pyplot.figlegend
一个例子是在图图例演示。
另一个例子:
plt.figlegend(lines, labels, loc = 'lower center', ncol=5, labelspacing=0.)
Or:
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()
基于gboffi和Ben Usman的回答:
如果在不同的子图中有不同的线,但颜色和标签相同,你可以这样做:
labels_handles = {
label: handle for ax in fig.axes for handle, label in zip(*ax.get_legend_handles_labels())
}
fig.legend(
labels_handles.values(),
labels_handles.keys(),
loc = "upper center",
bbox_to_anchor = (0.5, 0),
bbox_transform = plt.gcf().transFigure,
)
对于在具有多个轴的图形中自动定位单个图例,例如使用subplots()获得的图例,以下解决方案非常有效:
plt.legend(lines, labels, loc = 'lower center', bbox_to_anchor = (0, -0.1, 1, 1),
bbox_transform = plt.gcf().transFigure)
使用bbox_to_anchor和bbox_transform=plt.gcf()。transFigure,你正在定义一个新的边界框的大小你的数字作为loc的参考。使用(0,-0.1,1,1)将这个边界框略微向下移动,以防止图例被放置在其他艺术家之上。
OBS:在使用fig.set_size_inch()之后和使用fig.tight_layout()之前使用这个解决方案
还有一个很好的函数get_legend_handles_labels(),你可以在最后一个轴上调用(如果你迭代它们),它会收集你从label=参数中需要的一切:
handles, labels = ax.get_legend_handles_labels()
fig.legend(handles, labels, loc='upper center')