遍历字典键绘制子图报错求助:解决TypeError并实现共享标题子图
问题解决:绘制多子图栖息地-鸟类数量曲线
需求说明
给定字典habitat_dictionary,每个键对应DataFrame中的no._<键>列,需要:
- 针对每个键,绘制以对应列为x轴,y轴范围0-1,包含'robin'和'dove'两条曲线的图表
- 将所有图表整合为带共享标题的子图
原代码问题
你的代码存在两个关键问题:
- 第一行代码末尾缺失闭合的方括号与圆括号,导致语法错误
- 循环绘制会生成独立图表,无法实现共享标题的子图布局;且使用
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
相关产品推荐
相关产品推荐

