3

I'm creating a plot using matplotlib and it seems that I stucked with one problem. I draw 3 subplots and I want to get common legend for all of them

fig, (ax, ax2, ax3) = plt.subplots(3, 1, sharex=True)
ax.plot(FRAME1['T1'],FRAME1['Num'], marker = 'o', label='1')
ax2.plot(FRAME3['T1'],FRAME3['Num'], marker = 'o', label='2',color='r')
ax2.plot(FRAME4['T1'],FRAME4['Num'], marker = 'o', label='3',color='turquoise')
ax3.plot(FRAME2['T1'],FRAME2['Num'], marker = 'o', label='4',color='g')

ax.set_ylim(-118, -116.5)  
ax3.set_ylim(-136, -135)

plt.legend( (ax,ax2,ax3),loc="upper left", bbox_to_anchor=[0, 1],
           ncol=2, shadow=True, title="Legend", fancybox=True)

I have used the legend instance but it shows legen only on the last subplot.

Monica
  • 1,030
  • 3
  • 17
  • 37

1 Answers1

4

Of course you need to show the legend on one of the subplots. It's your decision which one you chose.

In order to show all four lines in the legend, you need to provide a reference to the lines to the legend

plt.legend(handles = [line1, line2, ...])

See also the Matplotlib legend guide.
So here is a working example

import numpy as np
import matplotlib.pyplot as plt

x = np.random.randint(0,12,size=(12,4))
y = np.random.randint(0,8,size=(12,4))

fig, (ax, ax2, ax3) = plt.subplots(3, 1, sharex=True, figsize=(5,5))

l, = ax.plot(x[:,0],y[:,0], marker = 'o', label='1')
l2, =ax2.plot(x[:,1],y[:,1], marker = 'o', label='2',color='r')
l3, =ax2.plot(x[:,2],y[:,2], marker = 'o', label='3',color='turquoise')
l4, =ax3.plot(x[:,3],y[:,3], marker = 'o', label='4',color='g')


plt.legend( handles=[l, l2, l3, l4],loc="upper left", bbox_to_anchor=[0, 1],
           ncol=2, shadow=True, title="Legend", fancybox=True)

plt.show()

enter image description here

user343233
  • 99
  • 6
ImportanceOfBeingErnest
  • 321,279
  • 53
  • 665
  • 712