简体   繁体   中英

module 'matplotlib.pyplot' has no attribute 'patches'

I'm trying to annotate precentage in horizontal barplot with matplotlib. The problem is that when I try to add the precentage annotation I get error:

"module 'matplotlib.pyplot' has no attribute 'patches'

This is how I try to create the chart:

import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
%matplotlib inline


sns.set(style="whitegrid")
#sns.set_color_codes("Spectral")



plt.figure(2, figsize=(20,15))
the_grid = GridSpec(2, 2)

plt.subplot(the_grid[0, 1],  title='Original Dataset')
sns.barplot(x='count',y='land_cover_specific', data=df, palette='Spectral')
plt.xlabel('Count')
plt.ylabel('Land cover')

total = len(original)
print(total)

for p in plt.patches:
        percentage = '{:.1f}%'.format(100 * p.get_width()/total)
        x = p.get_x() + p.get_width() + 0.02
        y = p.get_y() + p.get_height()/2
        plt.annotate(percentage, (x, y))

plt.show()

I get the bar plot but I do not get the annotation due to this error. 在此处输入图片说明

My end goal: to add teh rpecentage of each bar count out of the total

I think you only need to change :

sns.barplot(x='count',y='land_cover_specific', data=df, palette='Spectral')

to:

ax = sns.barplot(x='count',y='land_cover_specific', data=df, palette='Spectral')

and

for p in plt.patches:

to:

for p in ax.patches:
import seaborn as sns import matplotlib.pyplot as plt from matplotlib.gridspec import GridSpec %matplotlib inline sns.set(style="whitegrid") #sns.set_color_codes("Spectral") plt.figure(2, figsize=(20,15)) the_grid = GridSpec(2, 2) plt.subplot(the_grid[0, 1], title='Original Dataset') horizontal = sns.barplot(x='count',y='land_cover_specific', data=df, palette='Spectral') plt.xlabel('Count') plt.ylabel('Land cover') total = len(original) # print(total) # for p in plt.patches: # percentage = '{:.1f}%'.format(100 * p.get_width()/total) # x = p.get_x() + p.get_width() + 0.02 # y = p.get_y() + p.get_height()/2 # plt.annotate(percentage, (x, y)) def auto_label(horizontal_): for index, rectangle in enumerate(horizontal_): height = rectangle.get_height() width = rectangle.get_width() y_value = rectangle.get_y() # color is an array containing either hex or rgb values # each should map to the color of each in your barchart plt.text(width + height/2., y_value, "%d" % 100 * width / total, color=color[index]) auto_label(horizontal) plt.show()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM