如何在同一图表中分组绘制子类别互异的多组堆叠条形图
不等分段类别堆叠条形图实现方案
常规堆叠条形图教程默认所有条形的子类别完全对齐,是为了满足跨组同类别对比的需求,你这个场景属于单组构成展示,不需要跨组对齐行政区类别,不用硬套宽表逻辑,按下面的步骤实现即可:
第一步:用长表结构存储数据
不要做「土地区域为行、行政区为列」的宽表,也不需要给不同区域的行政区补空对齐,直接存三字段的长表即可:- 土地区域名称:对应x轴上的5个独立条形
- 行政区名称:对应每个条形内的分段标签
- 统计数值:对应该分段的长度
参考数据格式如下:
土地区域,行政区,统计值 西北片区,张庄,124 西北片区,李村,89 西北片区,王店,156 东南片区,赵屯,97 东南片区,钱集,132 ...每个土地区域对应多少个行政区,就存多少行数据即可,没有行数限制。
第二步:逐段计算位置绘制条形
不要直接调用封装好的固定类别堆叠绘图函数,不管你用Python的matplotlib/plotly、R的ggplot2还是Excel、BI工具,核心逻辑都是手动计算每个分段的起始位置:- 按土地区域分组,拆分出每个区域对应的行政区、数值列表
- 对单个区域的数值做累计计算,每个分段的底部起始坐标 = 该区域内排在它前面所有分段的数值之和,第一个分段的底部坐标为0
- 循环绘制每个分段:传入对应分段的高度、底部坐标,同步给每个分段绑定对应的行政区标签
以Python matplotlib为例,最小实现代码如下:
import matplotlib.pyplot as plt import pandas as pd # 读入长表格式数据 df = pd.read_csv("你的数据文件.csv") fig, ax = plt.subplots(figsize=(10, 7)) region_list = df["土地区域"].unique() x_position = range(len(region_list)) for x_idx, region in enumerate(region_list): region_subset = df[df["土地区域"] == region].reset_index(drop=True) current_bottom = 0 for _, row in region_subset.iterrows(): seg_val = row["统计值"] # 绘制单个分段 ax.bar(x_idx, seg_val, bottom=current_bottom, edgecolor="white", width=0.6) # 分段中心位置添加行政区标签 ax.text(x_idx, current_bottom + seg_val/2, row["行政区"], ha="center", va="center", fontsize=8) current_bottom += seg_val ax.set_xticks(x_position) ax.set_xticklabels(region_list) plt.tight_layout() plt.show()第三步:标签展示优化
因为各区域分段数量不等,部分分段宽度可能较窄,可根据实际效果调整展示方式:- 对数值过小、内部放不下文字的分段,把标签移到条形外侧,用细引线连接对应分段
- 同一土地区域下的分段使用同色系不同深浅的颜色填充,不同区域的色系做明显区分,降低视觉混淆
- 如果行政区总数量较多,静态图内标签拥挤的话,可以加交互效果:悬浮到对应分段时显示行政区名称和具体数值;静态输出则配套按区域分组的图例即可。
这个方案没有子类别数量限制,不管每个区域下辖5个还是9个行政区,都能自动适配堆叠,不需要提前对齐类别。
内容的提问来源于stack exchange,提问作者PhDavey
相关产品推荐
相关产品推荐

