Using a proxy artist inside a legend, matplotlib, Python

故事扮演 提交于 2019-12-24 16:18:53

问题


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?


回答1:


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



来源:https://stackoverflow.com/questions/33277566/using-a-proxy-artist-inside-a-legend-matplotlib-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!