import matplotlib.pyplot as pltimport numpy as np# Fixing random state for reproducibilitynp.random.seed(19680801)# Example datapeople = ('Tom', 'Dick', 'Harry', 'Slim', 'Jim')y_pos = np.arange(len(people))performance = 3 + 10 * np.random.rand(len(people))error = np.random.rand(len(people))fig, ax = plt.subplots()hbars = ax.barh(y_pos, performance, xerr=error, align='center')ax.set_yticks(y_pos, labels=people)ax.invert_yaxis() # labels read top-to-bottomax.set_xlabel('Performance')ax.set_title('How fast do you want to go today?')# Label with specially formatted floatsax.bar_label(hbars, fmt='%.2f')ax.set_xlim(right=15) # adjust xlim to fit labelsplt.show()
# 1. 导入库并设置随机种子import matplotlib.pyplot as pltimport numpy as npnp.random.seed(19680801) # 固定随机数生成器的种子,确保每次运行代码时生成的随机数相同,从而使结果可重复。# 2. 定义数据people = ('Tom', 'Dick', 'Harry', 'Slim', 'Jim') # 一个元组,包含五个人的名字,将作为 y 轴的刻度标签y_pos = np.arange(len(people)) # 生成 [0, 1, 2, 3, 4],这些数字将作为每个条形在 y 轴上的位置(水平条形图的 y 坐标)performance = 3 + 10 * np.random.rand(len(people)) # 生成长度为 5 的随机数组,每个值在 [0,1) 范围内,乘以 10 后加上 3,使得表现值落在 [3, 13) 之间,模拟每个人的表现评分。error = np.random.rand(len(people)) # 生成长度为 5 的随机数组,每个值在 [0,1) 范围内,作为每个条形对应的误差大小(用于误差条)。# 3. 创建图形和坐标轴fix, ax = plt.subplots()# 4. 绘制水平条形图并添加误差条hbars = ax.barh(y_pos, performance, xerr=error, align='center')# ax.barh() 绘制水平条形图,即条形沿 y 轴排列,长度表示数值。# 第一个参数 y_pos:每个条形的 y 坐标位置(数组)。# 第二个参数 performance:每个条形的长度(x 方向的值)。# xerr=error:为每个条形添加水平误差条(黑色小线段),误差大小由 error 数组指定。误差条以条形末端为中心,向左右延伸 error 长度。# align='center':条形以给定的 y 坐标为中心对齐(默认行为)。# 返回值 hbars 是一个 BarContainer 对象,包含所有绘制的条形,可用于后续添加标签等操作。# 5. 设置 y 轴刻度和标签ax.set_yticks(y_pos, labels=people)# 第一个参数 y_pos:刻度位置(即 [0,1,2,3,4])。# labels=people:每个刻度对应的标签,即人名 ('Tom', 'Dick', 'Harry', 'Slim', 'Jim')。# 6. 反转 y 轴ax.invert_yaxis()# 将 y 轴方向反转,使得第一个人名(Tom)显示在顶部,最后一个人名(Jim)显示在底部。# 通常条形图默认第一个数据点在底部,反转后更符合从上到下的阅读习惯。# 7. 设置 x 轴标签和标题ax.set_xlabel('Performance') # 设置 x 轴标签为 "Performance"ax.set_title('How fast do you want to go today?') # 设置图表标题为 "How fast do you want to go today?"# 8. 在条形末端添加数值标签ax.bar_label(hbars, fmt='%.2f')# ax.bar_label() 是 matplotlib 3.4.0 引入的方法,用于在条形上添加数值标签。# 第一个参数 hbars:之前绘制的条形容器。# fmt='%.2f':指定标签的格式,这里使用格式化字符串将数值保留两位小数。# 标签默认显示在每个条形的末端(对于水平条形图,是右侧末端)。# 9. 调整 x 轴范围以容纳标签ax.set_xlim(right=15) # 将 x 轴的最大值(右边界)设置为 15。# 10. 显示图形plt.show()