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

遍历字典键绘制子图报错求助:解决TypeError并实现共享标题子图

问题解决:绘制多子图栖息地-鸟类数量曲线

需求说明

给定字典habitat_dictionary,每个键对应DataFrame中的no._<键>列,需要:

  • 针对每个键,绘制以对应列为x轴,y轴范围0-1,包含'robin'和'dove'两条曲线的图表
  • 将所有图表整合为带共享标题的子图

原代码问题

你的代码存在两个关键问题:

  1. 第一行代码末尾缺失闭合的方括号与圆括号,导致语法错误
  2. 循环绘制会生成独立图表,无法实现共享标题的子图布局;且使用set_index后索引类型可能引发xticks处理异常,导致报错

完整解决方案代码

import pandas as pd
import matplotlib.pyplot as plt

# 初始化数据
habitat_dictionary = {'trees': 6, 'ponds': 10, 'scrub': 23}

d = {
    'no._trees': [1, 2],
    'no._rabbit_holes': [7, 8],
    'no._ponds': [3, 5],
    'no._scrub': [3, 2],
    'robin': [0.5, 0.6],
    'dove': [0.6, 0.2]
}
df = pd.DataFrame(data=d)

# 创建1行3列的子图布局,共享y轴以保持一致性
fig, axes = plt.subplots(nrows=1, ncols=len(habitat_dictionary), figsize=(15, 5), sharey=True)
# 设置整体共享标题
fig.suptitle('鸟类数量与栖息地的关系', fontsize=14, y=1.02)

# 遍历每个栖息地,绘制对应子图
for ax, habitat in zip(axes, habitat_dictionary.keys()):
    x_col = 'no._' + habitat
    # 筛选所需列并按x轴排序,避免折线跳变
    plot_data = df[[x_col, 'robin', 'dove']].sort_values(by=x_col)
    # 在指定子图上绘制折线图
    plot_data.plot(
        x=x_col,
        y=['robin', 'dove'],
        ylim=(0, 1),
        ax=ax,
        legend=True
    )
    # 设置子图标题和轴标签
    ax.set_title(f'栖息地:{habitat}')
    ax.set_xlabel(f'{x_col} 数量')

# 调整布局避免元素重叠
plt.tight_layout()
plt.show()

改进说明

  • 使用plt.subplots()创建统一子图布局,轻松实现共享y轴和整体标题
  • 替换set_index为直接指定x列的方式,避免索引类型引发的报错
  • 添加数据排序步骤,确保折线图按x轴顺序绘制,避免异常跳变
  • 统一设置子图标题和轴标签,提升图表可读性

内容的提问来源于stack exchange,提问作者Niam45

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 14:27:34