这是我的下面的代码:
def generate_bar_chart(self, x_data, y_data, legend, pic_name):
n = len(x_data)
plt.bar(range(n), y_data, align='center', color='steelblue', alpha=0.8, label=legend)
plt.xticks(range(n), x_data, rotation=90)
for x, y in enumerate(y_data):
plt.text(x, y+100, '%s' % round(y, 1), ha='center', rotation=90, alpha=0.8)
plt.grid(axis='y', linestyle='-', alpha=0.8)
plt.legend()
plt.tight_layout()
pic_file = os.path.join(self.pic_path, pic_name)
plt.savefig(pic_file)
plt.close()
enumerate()和plt.text可能有问题,请给我一些建议,谢谢!
答案 0 :(得分:2)
在您如何绘制此图时,我将更新两件事:
设置文本对齐方式-verticalalignment='bottom'
(或简写va
),这会使标签位置对标签长度不敏感。
使用plt.annotate
代替plt.text
。对于您的用例,参数非常相似,但是对数据的比例和当前的缩放级别也很健壮。
xytext=(0,5)
使文本从条形图的中心开始,在其上方5个点(还包括textcoords ='offset points')。
for x, y in enumerate(y_data):
plt.annotate('%s' % round(y, 1), xy=(x, y),
xytext=(0, 5), textcoords='offset points',
va='bottom', ha='center', rotation=90)
作为参考,仅使用plt.text
即可实现第一名:
for x, y in enumerate(y_data):
plt.text(x, y+300, '%s' % round(y, 1), ha='center',
va='bottom', rotation=90, alpha=0.8)
答案 1 :(得分:0)
如果我理解正确,您是否希望数字显示在条形上方?如果是这样,则只需在对text()的调用中修改y的偏移量即可。当前,您添加了100,但是请记住,这是用轴坐标表示的,因此考虑到y轴的总范围,100仍然是一个很小的值。例如尝试500。
为了为所有钢筋设置类似的偏移量,必须从相对角度定义偏移量。您可以在text()调用中尝试使用1.15 * y
代替y+100
。