解决TypeError: cannot unpack non-iterable PathCollection object错误——双轴组合图(柱状图+散点图)图例配置方案
解决双轴图的图例配置与TypeError问题
我来帮你搞定这个问题!先给你拆解下错误根源:ax2.scatter()方法返回的是单个PathCollection对象,它不像plt.plot()那样返回可迭代的线条对象。你在b, =和c, =里加逗号,是在尝试对一个不可迭代的对象做解包操作,这就直接触发了TypeError: cannot unpack non-iterable PathCollection object报错。
接下来我给你一步步调整代码,同时优化图例的配置,让它能正确显示在图表中心下方:
步骤1:修正散点图的赋值方式
把散点图行末尾的逗号去掉,直接赋值即可。同时给每个绘图元素加上label参数,方便后续图例调用:
# 柱状图添加label a = ax.bar(metal_list, graph_gw_list, color='yellow', label='Point') # 散点图去掉逗号,添加label b = ax2.scatter(metal_list, risk_list, color='cyan', label='Risk') c = ax2.scatter(metal_list, contam_list, color='green', label='Contaminant')
另外注意:你的代码里先调用了df['Point'].plot.bar(),又用ax.bar()画了一次柱状图,这会导致柱状图重复绘制,建议保留其中一个即可,下面的完整示例会保留ax.bar()版本。
步骤2:正确配置下方中心图例
现在我们可以利用每个元素的label属性自动生成图例,同时调整轴位置给图例留出空间,精准定位到中心下方:
修改后的完整代码
import matplotlib.pyplot as plt import pandas as pd # 假设你的df、element_list等变量已提前定义 df = df.set_index('Element') plt.errorbar(element_list, graph_gw_list, yerr=sd_list, linestyle='None', barsabove=True, markersize=8, capsize=10) fig, ax = plt.subplots(figsize=(10,7)) ax2 = ax.twinx() # 绘制各图表元素,添加label a = ax.bar(metal_list, graph_gw_list, color='yellow', label='Point') b = ax2.scatter(metal_list, risk_list, color='cyan', label='Risk') c = ax2.scatter(metal_list, contam_list, color='green', label='Contaminant') # 设置标题与轴标签 plt.title('Points per element') ax.set_xlabel('Element') ax.set_ylabel('Point') ax2.set_ylabel('Screening level') # 调整轴位置,给下方图例预留空间 box = ax.get_position() ax.set_position([box.x0, box.y0 + box.height * 0.1, box.width, box.height * 0.9]) # 配置图例:整合三个元素,放在中心下方 p = [a, b, c] labels = [item.get_label() for item in p] ax.legend(p, labels, loc='lower center', bbox_to_anchor=(0.5, -0.1), fontsize='small', ncol=3) plt.show()
关键说明
- 移除散点图赋值后的逗号,避免对不可迭代对象做解包操作,解决TypeError问题。
- 给每个绘图元素加
label参数,后续可以直接提取标签,不用手动重复编写。 - 通过
ax.set_position()调整主轴位置,再用bbox_to_anchor=(0.5, -0.1)让图例精准定位在图表中心下方,ncol=3让图例横向排列更美观。 - 移除了重复的柱状图绘制代码,避免图表重叠混乱。
这样修改后,你的双轴组合图就能正常渲染,图例也会乖乖出现在你想要的位置啦!
内容的提问来源于stack exchange,提问作者NenEnd13
相关产品推荐
相关产品推荐

