如何为百分比堆叠柱状图添加原始数据计数标注?
百分比堆叠柱状图添加原始计数标注实现方案
核心思路
要在堆叠柱状图的每个色块中心添加原始计数,需遍历每个柱子的两个色块(适配/不适配),分别计算色块的中心坐标,再在对应位置写入原始数值。关键是结合堆叠柱的底部位置和色块高度来确定中心y轴坐标。
完整代码示例(Jupyter Notebook环境)
import pandas as pd import matplotlib.pyplot as plt # ---------------------- 替换为你的实际DataFrame ---------------------- # 示例数据 data = { 'IL': ['地区A', '地区B', '地区C'], 'ENGELLIUYGUN': [120, 80, 150], 'ENGELLIUYGUNDEGIL': [30, 40, 50] } df = pd.DataFrame(data) # ------------------------------------------------------------------- # 计算各地区总数及占比 df['总数'] = df['ENGELLIUYGUN'] + df['ENGELLIUYGUNDEGIL'] df['适配占比'] = df['ENGELLIUYGUN'] / df['总数'] * 100 df['不适配占比'] = df['ENGELLIUYGUNDEGIL'] / df['总数'] * 100 # 初始化绘图 plt.style.use('seaborn-v0_8') fig, ax = plt.subplots(figsize=(10, 6)) x = range(len(df)) bar_width = 0.6 # 绘制堆叠柱状图(蓝色=适配,绿色=不适配) bars_adapt = ax.bar(x, df['适配占比'], bar_width, label='适配', color='#1f77b4') bars_unadapt = ax.bar(x, df['不适配占比'], bar_width, bottom=df['适配占比'], label='不适配', color='#2ca02c') # ---------------------- 核心标注逻辑 ---------------------- # 给蓝色适配柱添加原始计数 for bar, count in zip(bars_adapt, df['ENGELLIUYGUN']): bar_height = bar.get_height() # 中心坐标:x为柱子中点,y为柱子高度的一半(底部从0开始) ax.text(bar.get_x() + bar_width/2, bar_height/2, f'{count}', ha='center', va='center', fontsize=10, color='white') # 给绿色不适配柱添加原始计数 for bar, count, bottom_height in zip(bars_unadapt, df['ENGELLIUYGUNDEGIL'], df['适配占比']): bar_height = bar.get_height() # 中心坐标:x为柱子中点,y为适配柱高度 + 不适配柱高度的一半 ax.text(bar.get_x() + bar_width/2, bottom_height + bar_height/2, f'{count}', ha='center', va='center', fontsize=10, color='white') # --------------------------------------------------------- # 完善图表样式 ax.set_xlabel('地区', fontsize=12) ax.set_ylabel('占比 (%)', fontsize=12) ax.set_title('各地区适配情况百分比堆叠柱状图', fontsize=14) ax.set_xticks(x) ax.set_xticklabels(df['IL']) ax.legend() plt.tight_layout() plt.show()
关键细节说明
- 坐标计算:适配柱的底部是0,中心y坐标为自身高度的一半;不适配柱的底部是适配柱的高度,中心y坐标为适配柱高度加上自身高度的一半。
- 文本样式:用
color='white'保证文本在彩色柱子上清晰可读,可根据柱子颜色调整文本颜色;ha='center'和va='center'确保文本严格居中。 - 灵活性:如果你的柱子颜色、宽度或数据列名不同,只需对应修改代码中的颜色值、变量名即可。
内容的提问来源于stack exchange,提问作者Melisa
相关产品推荐
相关产品推荐

