如何使用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
相关产品推荐
相关产品推荐

