如何为堆叠面积图(Stackplot/Area Plot)添加数值标注
在Matplotlib堆叠面积图中添加数值标注
嘿,我来帮你搞定堆叠面积图的数值标注问题!你已经完成了堆叠图的绘制,现在只需要利用你计算好的cumsum数据,就能精准地把每个色块的数值标注在对应的位置上。
完整修改后的代码
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 原始数据 y1=[26.8,24.97,25.69,24.07] y2=[21.74,19.58,20.7,21.09] y3=[13.1,12.45,12.75,10.79] y4=[9.38,8.18,8.79,6.75] y5=[12.1,10.13,10.76,8.03] y6=[4.33,3.73,3.78,3.75] labels = ["Medical", "Surgical", "Physician Services", "Newborn", "Maternity", "Mental Health"] years = [2011,2012,2013,2014] x = range(len(years)) # 用索引更方便,最后替换成年份 # 计算累加值,用于确定每个色块的位置 df = pd.DataFrame([y1,y2,y3,y4,y5,y6], index=labels) cumsum = df.cumsum(axis=0) # 绘制堆叠面积图 fig, ax = plt.subplots(figsize=(10,6)) plt.title("Inpatient Costs by Category (2011-2014)", fontsize=14) ax.stackplot(x, y1,y2,y3,y4,y5,y6, labels=labels, colors = sns.color_palette("Blues")[::-1]) # 添加数值标注的核心部分 for i, label in enumerate(labels): # 获取当前系列的数据 current_values = df.loc[label].values # 计算当前系列每个点的中间位置:底部(上一个累加值) + 当前值的一半 if i == 0: bottom = 0 else: bottom = cumsum.loc[labels[i-1]].values mid_y = bottom + current_values / 2 # 遍历每个x位置,添加标注 for xi, y_val, val in zip(x, mid_y, current_values): # 根据色块深浅调整文字颜色,提升可读性 text_color = 'white' if i >= 3 else 'black' ax.text(xi, y_val, f"{val:.2f}", ha='center', va='center', fontsize=10, color=text_color) # 调整图表样式 ax.spines[['right', 'top', 'bottom', 'left']].set_visible(False) ax.set_xticks(x) ax.set_xticklabels(years) # 将x轴替换为年份,更直观 plt.legend(bbox_to_anchor=(1.05, 1), loc="upper left", borderaxespad=0) plt.tight_layout() plt.show()
关键步骤解释
- 精准计算标注位置:每个堆叠色块的底部是上一个系列的累加值(第一个系列底部为0),所以中间位置就是
底部 + 当前数值/2,这样标注会正好落在色块的垂直中心,不会偏移。 - 优化标注可读性:根据色块的深浅调整文字颜色——深色色块用黑色字,浅色色块用白色字,避免标注和背景混在一起,保证视觉清晰。
- x轴友好化:把原来的
[1,2,3,4]替换成实际年份标签,让图表的时间维度更直观易懂。
这样修改后,你的堆叠面积图就会清晰地显示每个类别的具体数值啦!
内容的提问来源于stack exchange,提问作者fiona




