You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用matplotlib.pyplot.stackplot()为堆叠图添加数据标签

给Matplotlib堆叠图添加数据标签

先修正你代码里的两处小问题:

  • plt.stackplot的第一个参数应为days_x,原代码里的minutes是未定义变量
  • 删除无效的plt.set语句

下面是添加数据标签的完整实现思路与代码:堆叠图的每个层是基于前一层的累加值,我们需要计算每个员工数据对应的y轴中心位置,再循环添加文本标签。

import matplotlib.pyplot as plt
import numpy as np

plt.style.use('fivethirtyeight')

days_x = list(range(1, 10))
emp1 = [8,6,5,5,4,2,1,1,0]
emp2 = [0,1,2,2,2,4,4,4,4]
emp3 = [0,1,1,1,2,2,3,3,4]
emp_labels = ['Employee 1', 'Employee 2', 'Employee 3']

# 绘制堆叠图,获取每层的图形对象
layers = plt.stackplot(days_x, emp1, emp2, emp3, labels=emp_labels)

# 给Employee 1添加标签(最底层,y值为自身数据的一半)
for x, y in zip(days_x, emp1):
    if y > 0:  # 跳过0值,避免冗余
        plt.text(x, y/2, str(y), ha='center', va='center', fontsize=10)

# 给Employee 2添加标签(基于emp1的累加值计算位置)
emp1_cum = np.cumsum(emp1)
for x, cum_y, y in zip(days_x, emp1_cum, emp2):
    if y > 0:
        plt.text(x, cum_y - y/2, str(y), ha='center', va='center', fontsize=10)

# 给Employee 3添加标签(基于emp1+emp2的累加值计算位置)
emp1_2_cum = np.cumsum(np.array(emp1) + np.array(emp2))
for x, cum_y, y in zip(days_x, emp1_2_cum, emp3):
    if y > 0:
        plt.text(x, cum_y - y/2, str(y), ha='center', va='center', fontsize=10)

# 图表基础设置
plt.title('Contributed Hours of Work in 8-hour Shifts', fontdict={'fontsize' : 18})
plt.xticks(np.arange(1, 10, 1))
plt.xlabel('Days')
plt.ylabel('Hours')
plt.yticks(np.arange(0, 10, 1))
plt.legend(loc=1)
plt.tight_layout()

plt.show()

核心说明:

  • 通过累加前序员工的数据,计算当前堆叠块的y轴范围,再取中间值作为标签位置,确保标签居中显示
  • 加入if y > 0的判断,避免在无贡献的位置显示0值标签
  • ha='center'和va='center'确保文本在对应堆叠块内水平、垂直居中

内容的提问来源于stack exchange,提问作者Jovan Mampusti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 08:07:50