import matplotlib.pyplot as pltimport numpy as np# data from https://allisonhorst.github.io/palmerpenguins/species = ( "Adelie\n $\\mu=$3700.66g", "Chinstrap\n $\\mu=$3733.09g", "Gentoo\n $\\mu=$5076.02g",)weight_counts = { "Below": np.array([70, 31, 58]), "Above": np.array([82, 37, 66]),}width = 0.5fig, ax = plt.subplots()bottom = np.zeros(3)for boolean, weight_count in weight_counts.items(): p = ax.bar(species, weight_count, width, label=boolean, bottom=bottom) bottom += weight_countax.set_title("Number of penguins with above average body mass")ax.legend(loc="upper right")plt.show()
# 1. 导入库import matplotlib.pyplot as pltimport numpy as np# 2. 定义数据species = ( "Adelie\n $\\mu=$3700.66g", "Chinstrap\n $\\mu=$3733.09g", "Gentoo\n $\\mu=$5076.02g",)# 一个元组,包含三种企鹅的名称和平均体重信息,将作为 x 轴的刻度标签。# 字符串中使用 \n 换行,第一行显示物种名,第二行显示平均体重(用 LaTeX 格式 $\mu=$ 表示希腊字母 μ,后跟体重值及单位 “g”)。weight_counts = { "Below":np.array([70, 31, 58]), "Above":np.array([82, 37, 66])}# 一个字典,键为 "Below"(低于平均)和 "Above"(高于平均),值为每种企鹅对应类别的个体数量(NumPy 数组)。# 例如 "Below" 对应 [70, 31, 58] 表示阿德利企鹅低于平均的有 70 只,帽带企鹅 31 只,巴布亚企鹅 58 只。width = 0.5 # 条形宽度设为 0.5,控制条形的粗细。# 3. 创建图形和坐标轴fig, ax = plt.subplots()# 4. 初始化堆叠基准bottom = np.zeros(3)# bottom 是一个长度为 3 的数组(与物种数量一致),用于记录每个条形当前的底部起始高度。# 初始为全 0,表示第一个绘制的类别将从 0 开始绘制。# 5. 循环绘制堆叠条形for boolean, weight_count in weight_counts.items(): # 遍历字典中的每个类别及其对应的数量数组。由于 Python 3.7+ 字典保持插入顺序,因此先遍历 "Below",后遍历 "Above"。 p = ax.bar(species, weight_count, width, label=boolean, bottom=bottom) # ax.bar() 绘制垂直条形图: # species:x 轴位置(类别标签)。 # weight_count:每个条形的高度(该类别对应物种的数量)。 # width:条形宽度。 # label=boolean:设置图例标签,后续 legend() 会显示 “Below” 和 “Above”。 # bottom=bottom:关键参数,指定每个条形的底部起始高度。第一次循环时 bottom 为 [0,0,0],所以 “Below” 条形从 0 开始绘制; # 第二次循环时 bottom 已更新为第一次的高度(即 “Below” 的数量),因此 “Above” 条形会从 “Below” 条形顶部开始绘制,实现堆叠效果 bottom += weight_count # 将当前类别的数量累加到 bottom 上,作为下一个类别条形的底部起始高度。# 6. 设置标题和图例ax.set_title("Number of penguins with above average body mass") # 设置图表标题ax.legend(loc="upper right") # 显示图例,并将其放置在右上角。(loc="upper right")。图例会包含两个条目:Below(蓝色,默认颜色)和 Above(橙色,默认颜色)。# 7. 显示图形plt.show()
