Pandas Multi-Index折线图:按canton循环生成子图实现方法
代码问题排查
你原有代码存在3个核心问题,导致无法生成预期效果:
taxrates_short.set_index("year")未做赋值,pandas默认不修改原数据集,该操作实际未生效- 直接对
canton和income双字段分组绘图,未预先拆分对应canton的子图容器,所有折线会堆叠在同一个绘图轴上 - 未区分分组层级,没有实现「外层按canton匹配独立子图、内层按income绘制单条折线」的逻辑
修正后可运行代码
import matplotlib.pyplot as plt # 1. 预处理:将year设为索引,注意赋值回原变量使操作生效 taxrates_short = taxrates_short.set_index("year") # 2. 初始化子图网格 canton_list = taxrates_short["canton"].unique() canton_count = len(canton_list) col_num = 3 # 可根据需求调整每行子图数量 row_num = (canton_count + col_num - 1) // col_num # 自动计算需要的行数 fig, axes = plt.subplots(row_num, col_num, figsize=(16, 5*row_num), sharex=True, sharey=True) axes = axes.flatten() # 将二维轴数组展平,方便遍历 # 3. 循环绘制每个canton的子图 for ax, canton in zip(axes, canton_list): # 筛选当前canton的所有数据 current_canton_data = taxrates_short[taxrates_short["canton"] == canton] # 子图内按income分组绘制每条折线 for income, group_data in current_canton_data.groupby("income"): ax.plot(group_data.index, group_data["avg_tax_rate"], label=f"Income {income}") # 配置子图样式 ax.set_title(f"Canton {canton}") ax.set_xlabel("Year") ax.set_ylabel("Avg Tax Rate") ax.legend(fontsize=7) ax.grid(alpha=0.3) # 隐藏多余的空白子图 for ax in axes[canton_count:]: ax.axis("off") plt.tight_layout() plt.show()
关键调整说明
- 所有DataFrame的非inplace操作必须赋值回变量,否则修改不会实际生效
- 采用两层循环逻辑:外层遍历每个canton和对应的子图轴,内层遍历当前canton下不同收入组的数据绘制折线,完全匹配需求的子图结构
- 子图初始化时设置
sharex=True、sharey=True统一坐标轴尺度,和参考样式的排版逻辑一致 - 遍历完成后关闭无对应数据的空白子图,避免出现空图框影响观感
内容的提问来源于stack exchange,提问作者Lavokv
相关产品推荐
相关产品推荐

