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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:54:17