You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为堆叠面积图(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

火山引擎 最新活动