如何在Python中根据字典的键绘制对应的值列表
解决Matplotlib绘图时X/Y维度不匹配的报错问题
问题背景
我有一个以整数为键、嵌套列表为值的字典,示例结构如下:
df_param={0: [[0], [20], [20], [20], [5], [1], [5]], 1: [[0], [20], [20], [5], [1], [5]], 2: [[0], [20], [20], [5], [5]], 3: [[0], [20], [5], [5]], 4: [[0], [5], [5]], 5: [[0], [5]], 6: [[0]], 7: [[0]], 8: [[0], [20]], 9: [[0]], 10: [[0]]}
想要将字典的键作为X轴,对应的值列表作为Y轴绘图,使用以下代码时触发报错:
import matplotlib.pyplot as plt for key, values in df_param.items(): plt.plot(key, values) plt.show()
报错信息:
ValueError: x and y must have same first dimension, but have shapes (1,) and (7, 1)
报错原因
plt.plot()要求X和Y的维度必须完全一致。当前代码中,每个key是单个整数(维度为1),但对应的values是包含多个子列表的嵌套列表(比如键0对应的值有7个元素,维度为7),两者维度不匹配,因此触发维度错误。
解决方法
方法1:绘制散点图(每个值对应同一X坐标)
如果需要将同一个键下的所有值都绘制在该键对应的X位置上,先扁平化嵌套列表,再为每个值生成相同的X坐标:
import matplotlib.pyplot as plt # 预处理数据 x_coords = [] y_coords = [] for key, values in df_param.items(): # 取出嵌套列表中的单个数值,扁平化数据 flat_values = [val[0] for val in values] # 为每个Y值匹配对应的X坐标 x_coords.extend([key] * len(flat_values)) y_coords.extend(flat_values) plt.scatter(x_coords, y_coords, s=10) plt.xlabel('字典键(X轴)') plt.ylabel('值(Y轴)') plt.show()
方法2:绘制折线图(每个键对应一条独立折线)
如果要把每个键下的多个值连成一条折线,需要为每个值生成从当前键开始的连续X偏移值:
import matplotlib.pyplot as plt for key, values in df_param.items(): # 扁平化Y值 y_vals = [val[0] for val in values] # 生成对应X值:从key开始,按值的数量生成连续坐标 x_vals = [key + idx for idx in range(len(y_vals))] plt.plot(x_vals, y_vals, marker='o', label=f'Key {key}') plt.xlabel('X轴') plt.ylabel('Y轴') plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left') plt.tight_layout() plt.show()
方法3:绘制箱线图(展示每个键对应值的分布)
如果需要直观展示每个键对应值的分布情况,可以使用箱线图:
import matplotlib.pyplot as plt # 整理数据:按键排序后扁平化每个键对应的值 sorted_keys = sorted(df_param.keys()) data_groups = [] for key in sorted_keys: data_groups.append([val[0] for val in df_param[key]]) plt.boxplot(data_groups, labels=sorted_keys) plt.xlabel('字典键') plt.ylabel('值分布') plt.show()
内容的提问来源于stack exchange,提问作者Priyanka Rajendran
相关产品推荐
相关产品推荐

