Amos
Amos

Reputation: 115

Adding a legend outside of multiple subplots with matplotlib

I am making a few figures where each one has a different amount of subplots in it. I am trying to add a legend in the bottom right corner but am having some trouble. I tried adding a new subplot in the bottom right and adding a legend only to it but then had an empty subplot behind the legend. This is where I'm standing now but want the legend in the bottom right corner regardless of where the last subplot is.

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()

Upvotes: 7

Views: 18609

Answers (2)

has2k1
has2k1

Reputation: 2395

A better solution is

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

This adds the legend to the figure instead of the subplot.

Adapted to your example, it would be something like

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()

Upvotes: 12

Amos
Amos

Reputation: 115

I ended up adding an extra subplot which I removed the frame and axis of, then plotted nothing to it and added a legend

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')

This left me with only the legend in the bottom right corner regardless of how many subplots I actually had.

Upvotes: 1

Related Questions