在matplotlib多个子图外添加图例

7 投票
2 回答
16465 浏览
提问于 2025-04-18 08:17

我正在制作几个图表,每个图表里面的子图数量都不一样。我想在右下角添加一个图例,但遇到了一些麻烦。我尝试在右下角添加一个新的子图,并只在这个子图上放置图例,但这样就会在图例后面出现一个空的子图。目前我做到了这个样子,但我希望图例能始终出现在右下角,不管最后一个子图在哪里。

fig = plt.figure()
matplotlib.rc('xtick', labelsize=8) 
matplotlib.rc('ytick', labelsize=8)

for line in a[1:]:

        ax = fig.add_subplot(subcol,subrow,counter)
        ax.plot(x,line[3:7],marker='o', color='r', label = 'oral')
        ax.plot(x,line[7:],marker='o', color='b',label = 'physa')
        ax.set_title(line[1],fontsize = 10)
        counter+=1

ax.legend(bbox_to_anchor=(2, 0),loc = 'lower right')
plt.subplots_adjust(left=0.07, right=0.93, wspace=0.25, hspace=0.35)
plt.suptitle('Kegg hedgehog',size=16)
plt.show()

2 个回答

2

我最后加了一个额外的子图,把它的边框和坐标轴都去掉了,然后什么都没往里面画,只是加了一个图例。

lastSubplot = plt.subplot(subcol,subrow,subcol*subrow)
lastSubplot.set_frame_on(False)
lastSubplot.get_xaxis().set_visible(False)
lastSubplot.get_yaxis().set_visible(False)
plt.plot(0, 0, marker='o', color='r', label = 'line1')
plt.plot(0, 0, marker='o', color='b', label = 'line2')
lastSubplot.legend(loc = 'lower right')

这样一来,不管我实际上有多少个子图,右下角只剩下了图例。

11

一个更好的解决方案是

fig.legend(handles, labels, loc='', ...)

这样做会把图例添加到整个图形上,而不是只添加到子图上。

根据你的例子,应该是这样的

fig = plt.figure()
matplotlib.rc('xtick', labelsize=8) 
matplotlib.rc('ytick', labelsize=8)

handles = []
for line in a[1:]:

        ax = fig.add_subplot(subcol,subrow,counter)
        l1 = ax.plot(x,line[3:7],marker='o', color='r', label = 'oral')
        l2 = ax.plot(x,line[7:],marker='o', color='b',label = 'physa')
        if not handles:
           handles = [l1, l2]
        ax.set_title(line[1],fontsize = 10)
        counter+=1

fig.legend(handles, ['oral', 'physa'], bbox_to_anchor=(2, 0),loc = 'lower right')
plt.subplots_adjust(left=0.07, right=0.93, wspace=0.25, hspace=0.35)
plt.suptitle('Kegg hedgehog',size=16)
plt.show()

撰写回答