ValueError:x与y第一维度不一致,DataFrame列表字段matplotlib绘图报错如何解决
报错根因
你遇到的ValueError: x and y must have same first dimension, but have shapes (6,) and (3,)报错,核心和数据类型无关,本质是每行timestep列的列表长度与对应行scores列的列表长度不匹配。
从你给出的样例数据可以看到:前4个样本的scores只有3个元素,第5个样本的scores有4个元素,但所有样本的timestep都有6个元素。折线图要求x、y轴的数值点数量完全一致,因此即使将列表转为numpy数组也无法解决问题。
同时你使用的plt.plot('timestep', 'scores', data=test.iloc[p])写法本身不适用于列存储列表的场景,该语法仅支持data参数为普通DataFrame、传入列名对应一维标量的情况。
可行解决方案
根据你的实际需求选择对应方案即可:
方案1:对齐x/y序列长度后绘图
如果业务逻辑允许取两个序列的交集部分绘图,可以直接截取相同长度的元素后再绘制:
import matplotlib.pyplot as plt c = ['blue', 'olive', 'yellow', 'red', 'purple'] for p in range(len(test)): ts = test.iloc[p]['timestep'] sc = test.iloc[p]['scores'] # 取两个序列的最小长度做对齐 min_len = min(len(ts), len(sc)) # 绘图并指定对应图例 plt.plot(ts[:min_len], sc[:min_len], color=c[p], linewidth=2, label=f'pop member {p}') plt.legend() plt.xlabel('Timesteps') plt.ylabel('Scores') plt.show()
方案2:修复上游数据生成逻辑
如果业务要求scores和timestep必须一一对应,说明你在生成这两列数据的环节就存在逻辑错误,比如timestep多记录了点位、scores少统计了点位,排查修复上游代码保证同一样本的两个列表长度一致后,就可以正常绘图。
内容的提问来源于stack exchange,提问作者K2G
相关产品推荐
相关产品推荐

