2

Here is a snippet of my code:

fig2 = plt.figure(figsize=(8,6))
ax1 = fig2.add_subplot(111)
ax1.scatter((logngal),(logm200),c='r',label='$0.0<z<1.0$')
ax1.plot((logngal),(curve_y_1),'y',linewidth=2,label='$slope=%s \pm %s$'%(slope1,slope1_err))


ax1.fill_between(x_pred, lower, upper, color='#888888', alpha=0.5)
p1 = mpatches.Rectangle((0, 0), 1, 1, fc="#888888",alpha=0.5)
ax1.legend([p1],['$1\sigma\/confidence\/limts$'])

fig2.show()

When I perform the above, I only see $1\sigma\/confidence\/limts$ mentioned in the legend.

Whereas as you can see that I also call label='$0.0<z<1.0$' and label='$slope=%s \pm %s$'%(slope1,slope1_err) in ax1.scatter and ax1.plot respectively.

This does not get plotted in the legend.

How do I add all the above three labels inside the legend?

Srivatsan
  • 9,225
  • 13
  • 58
  • 83

1 Answers1

6

you need to grab the scatter and plot artists as you plot them, and then feed the handles and labels from them to legend. For example, here's your code modified (with some sample data at the beginning just to get it to run):

plt.plot returns a list of Line2D objects, so if you read it as pplot, = plt.plot(...), you unpack that one-item list.

You can then use .get_label() on pplot and pscat to give the labels to the legend.

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.patches as mpatches

# Some things to make your script run when I don't have your data
slope1,slope1_err='this','that'
logngal   = np.linspace(0,1,20)
logm200   = np.random.rand(20)
x_pred    = np.linspace(0,1,20)
curve_y_1 = 0.5*(np.sin(logngal)/2.+np.cos(logngal))
upper     = np.sin(x_pred)/2.
lower     = np.cos(x_pred)
# end of sample data

fig2 = plt.figure(figsize=(8,6))
ax1 = fig2.add_subplot(111)

pscat  = ax1.scatter((logngal),(logm200), c='r',label='$0.0<z<1.0$')
pplot, = ax1.plot((logngal),(curve_y_1),'y',linewidth=2,label='$slope=%s \pm %s$'%(slope1,slope1_err))

ax1.fill_between(x_pred, lower, upper,color='#888888', alpha=0.5)

p1 = mpatches.Rectangle((0, 0), 1, 1, fc="#888888",alpha=0.5)

handles = [p1,pplot,pscat]
labels  = ['$1\sigma\/confidence\/limts$',pplot.get_label(),pscat.get_label()]

ax1.legend(handles,labels)

fig2.show()

enter image description here

tmdavison
  • 64,360
  • 12
  • 187
  • 165