我用下面的代码创建了一个条形图。我想为每个用户标记总计为~100%的百分比,就像我在下面的user 1和user 2的MSpaint中所做的那样:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
users = ['user1', 'user2', 'user3', 'user4', 'user5', 'user6', 'user7',\
'user8', 'user9', 'user10', 'user11', 'user12']
NEG = [433, 1469, 1348, 2311, 522, 924, 54, 720, 317, 135, 388, 9]
NEU = [2529, 4599, 4617, 4297, 1782, 2742, 61, 2640, 1031, 404, 1723, 76]
POS = [611, 1149, 1262, 1378, 411, 382, 29, 513, 421, 101, 584, 49]
data = {'Negative': NEG, 'Neutral': NEU, 'Positive': POS}
df = pd.DataFrame(data, index=users)
ax = df.plot(kind='bar', ylabel='Number of Messages\nw/ <= 128 Characters',\
xlabel='Username', title='Discord Sentiment Analysis',\
color=['coral', 'khaki', 'skyblue'])
plt.tight_layout()
plt.show()
根据this thread的建议,我做了以下尝试:
尝试1
ax = df.plot(kind='bar', ylabel='Number of Messages\nw/ <= 128 Characters',\
xlabel='Username', title='Discord Sentiment Analysis',\
color=['coral', 'khaki', 'skyblue'])
for p in ax.containers:
ax.bar_label(p, fmt='%.1f%%', label_type='edge')`
plt.tight_layout()
plt.show()
尝试2
ax = df.plot(kind='bar', ylabel='Number of Messages\nw/ <= 128 Characters',\
xlabel='Username', title='Discord Sentiment Analysis',\
color=['coral', 'khaki', 'skyblue'])
for p in ax.patches:
width = p.get_width()
height = p.get_height()
x, y = p.get_xy()
ax.annotate(f'{height:.0%}', (x + width/2, y + height*1.02), ha='center')
plt.tight_layout()
plt.show()
尝试3
ax = df.plot(kind='bar', ylabel='Number of Messages\nw/ <= 128 Characters',\
xlabel='Username', title='Discord Sentiment Analysis',\
color=['coral', 'khaki', 'skyblue'])
for p in ax.containers:
ax.bar_label(p, fmt='%.1f%%', label_type='edge')
plt.tight_layout()
plt.show()
1条答案
按热度按时间shyt4zoc1#
绘制
df
,但创建一个百分比的 Dataframe ,它可以用作.bar_label
的自定义labels
。注解分组水平条形图的代码
kind='barh'
完全相同。df
percent