# In[1]
import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
%matplotlib inline
import numpy as np
plt.legend command, which automatically creates a legend for any labeled plot elements.# In[2]
x=np.linspace(0,10,1000)
fig,ax=plt.subplots()
ax.plot(x,np.sin(x),'-b',label='Sine')
ax.plot(x,np.cos(x),'--r',label='Cosine')
ax.axis('equal')
leg=ax.legend()

# In[3]
ax.legend(loc='upper left',frameon=True)
fig

ncol command to specify the number of columns in the legend.# In[4]
ax.legend(loc='lower center',ncol=2)
fig

# In[5]
ax.legend(frameon=True,fancybox=True,framealpha=1,
shadow=True,borderpad=1)
fig

For more information on available legend options, refer to this url :
plt.legend documentation
plot commands.plt.plot is able to create multiple lines at once, and returns a list of created line instances.plt.legend will tell it which to identify, along with the labels we'd like to specify.# In[6]
y=np.sin(x[:,np.newaxis] + np.pi * np.arange(0,2,0.5))
lines=plt.plot(x,y)
# lines is a list of plt.Line2D instances
plt.legend(lines[:2],['first','second'],frameon=True);

# In[7]
plt.plot(x,y[:,0],label='first')
plt.plot(x,y[:,1],label='second')
plt.plot(x,y[:,2:])
plt.legend(frameon=True);
label attribute set.
legend interface, it is only possible to create a single legend for the entire plot.plt.legend or ax.legend, it will simply override the first one.Artist is the base class Matplotlib uses for visual attributes) from scratch, and then using the lower-level ax.add_artist method to manually add the second artist to the plot.# In[8]
fig,ax=plt.subplots()
lines=[]
styles=['-','--','-.',':']
x=np.linspace(0,10,1000)
for i in range(4):
lines += ax.plot(x,np.sin(x - i * np.pi / 2),styles[i],color='black')
ax.axis('equal')
# specify the lines and labels of the first legend
ax.legend(lines[:2],['line A','line B'],loc='upper right')
# create the second legend and add the artist manually
from matplotlib.legend import Legend
leg=Legend(ax,lines[:2],['line C','line D'],loc='lower right')
ax.add_artist(leg);

ax.legend, you'll see that the function simply consists of some logic to create a suitable Legend artist, which is then saved in the legend_ attribute and added to the figure when the plot is drawn.For more information about plt.subplots(), refer to these urls :
1. plt.subplots() documentation
2. About subplots() in Matplotlib
3. Difference between subplot() and subplots()