Python legend attribute error

Why am I getting an error related to the plt.plot label here?

fig = plt.figure() ax = plt.gca() barplt = plt.bar(bins,frq,align='center',label='Dgr') normplt = plt.plot(bins_n,frq_n,'--r', label='Norm'); ax.set_xlim([min(bins)-1, max(bins)+1]) ax.set_ylim([0, max(frq)]) plt.xlabel('Dgr') plt.ylabel('Frequency') plt.show() plt.legend(handles=[barplt,normplt]) 

This is the error I get: The 'list' object does not have the 'get_label' attribute

+11
matplotlib
source share
2 answers

Since plt.plot can display more than one line at a time, it returns a list of line2D objects, even if you only draw one line (i.e., in your case, a list of length 1). When you take his pen for a legend, you want to use only the first element of this list (the actual line2D object).

There are (at least) two ways to solve this problem:

1) add a comma after normplt when you call plt.plot to save only the first item from the list in normplt

 barplt = plt.bar(bins,frq,width,align='center',label='Dgr') normplt, = plt.plot(bins_n,frq_n,'--r', label='Norm') # note the comma after normplt print normplt # Line2D(Norm) <-- This is the line2D object, not a list, so we can use it in legend ... plt.legend(handles=[barplt,normplt]) 

2) Use only the first item in the list when you call plt.legend ( normplt[0] ):

 barplt = plt.bar(bins,frq,width,align='center',label='Dgr') normplt = plt.plot(bins_n,frq_n,'--r', label='Norm') print normplt # [<matplotlib.lines.Line2D object at 0x112076710>] # Note, this is a list containing the Line2D object. We just want the object, # so we can use normplt[0] in legend ... plt.legend(handles=[barplt,normplt[0]]) 
+22
source share

In the new version of matplotlib ( 3.1.0 ), a new method for creating legends for scatter plots has been added.

PathCollection now provides the legend_elements () method to automatically obtain markers and labels for a scatter chart. This makes creating a legend for a scatter plot as easy as

So, you can also use automatic legend creation :

 N = 45 x, y = np.random.rand(2, N) c = np.random.randint(1, 5, size=N) s = np.random.randint(10, 220, size=N) fig, ax = plt.subplots() scatter = ax.scatter(x, y, c=c, s=s) # produce a legend with the unique colors from the scatter legend1 = ax.legend(*scatter.legend_elements(), loc="lower left", title="Classes") ax.add_artist(legend1) # produce a legend with a cross section of sizes from the scatter handles, labels = scatter.legend_elements(prop="sizes", alpha=0.6) legend2 = ax.legend(handles, labels, loc="upper right", title="Sizes") plt.show() 

enter image description here

0
source share

All Articles