如何创建显示平均价格的柱状图?代码执行后未显示平均价格
解决柱状图不显示平均价格的问题
你的代码核心问题是柱状图上方文本的坐标计算错误,导致文本位置偏移甚至超出可视范围,所以看不到平均价格。以下是修正后的代码及改动说明:
修正后的完整代码
import numpy as np import matplotlib.pyplot as plt # 假设labels、values、levels_values是已定义的变量 avg_values = {} for i in labels: valuesforlevel = values[levels_values['town']==i] avg = np.average(valuesforlevel) print("Average for level " + i + " is {:.0f}".format(avg)) avg_values[i] = avg plt.figure(1, figsize=(12, 8)) # 原50x50尺寸过大,调整为合理范围 barchart = plt.bar(list(avg_values.keys()), list(avg_values.values()), color='#d62728') # 计算最大价格用于设置文本偏移量 max_price = max(avg_values.values()) for i in range(len(barchart)): bar = barchart[i] x, y = bar.get_xy() w = bar.get_width() # 获取柱子宽度 h = bar.get_height() # 调整文本位置:水平居中在柱子上方,垂直方向轻微偏移避免贴顶 plt.text( x + w/2, # 柱子水平中心位置 h + max_price * 0.01, # 柱子顶部上方偏移1%最大价格的距离 "{:.0f}".format(list(avg_values.values())[i]), fontsize=12, ha='center' # 水平居中对齐 ) plt.title('Resale price', fontsize=16) plt.ylabel('Resale price', fontsize=14) plt.yticks(fontsize=10) plt.xticks(fontsize=12, rotation='vertical') plt.tight_layout() # 自动调整布局,防止标签被截断 plt.show()
关键改动点
- 文本坐标修正:原代码用柱子左下角的x值作为文本位置,改成
x + w/2让文本居中在柱子顶部;同时给y坐标增加小偏移量,避免和柱子顶部完全重合。 - 画布尺寸优化:原
figsize=(50,50)过大,会导致元素显示比例失调,调整为更实用的(12,8)。 - 布局自动调整:添加
plt.tight_layout(),防止x轴垂直标签被画布边缘截断。 - 补充必要导入:添加
numpy和matplotlib.pyplot的导入语句(如果你的代码里已包含可忽略)。
额外排查点
如果仍看不到文本,检查以下内容:
- 确认
avg_values不是空字典,且内部包含有效数值 - 根据数据范围调整文本的
fontsize和偏移量,确保文本落在画布可视区域内
内容的提问来源于stack exchange,提问作者unleasehed
相关产品推荐
相关产品推荐

