Python从CSV数据绘制pcolormesh遇维度错误求解决
解决pcolormesh绘制CSV数据时的维度错误问题
问题描述
尝试用Python从CSV文件绘制pcolormesh热图,CSV数据如下:
ratio 5% 10% 20% 30% 40% 50% 1.2 0.60 0.63 0.62 0.66 0.66 0.77 1.5 0.71 0.81 0.75 0.78 0.76 0.77 1.8 0.70 0.82 0.80 0.73 0.80 0.78 1.2 0.75 0.84 0.94 0.84 0.76 0.82 2.3 0.80 0.92 0.93 0.85 0.87 0.86 2.5 0.80 0.85 0.91 0.85 0.87 0.88 2.9 0.85 0.91 0.96 0.96 0.86 0.87
需求为:X轴显示ratio列的值,Y轴对应[0.05, 0.1, 0.2, 0.3, 0.4, 0.5]阈值,填充第二列及之后的数值。但原代码因维度错误无法运行:
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filterwarnings('ignore') df = pd.read_csv('./result.csv') xlabel = df['ratio'] ylabel = [0.05, 0.1, 0.2, 0.3, 0.4, 0.5] plt.figure(figsize=(8, 6)) df = df.iloc[:, 1:] plt.pcolormesh(df, xlabel, ylabel, cmap='RdBu') plt.colorbar() plt.xlabel('rati0') plt.ylabel('threshold') plt.show()
错误原因分析
- 参数顺序错误:
pcolormesh的标准参数顺序为X, Y, C(坐标网格+颜色数据),原代码将颜色数据放在首位,导致维度匹配失败。 - 坐标网格缺失:未生成与颜色数据维度对应的坐标网格,直接传入一维数组无法满足绘图要求。
- CSV读取问题:原数据用空格分隔,未指定分隔符可能导致列解析错误。
- 重复X值处理:
ratio列存在重复值,需明确是保留原始行还是聚合处理。
修正后的代码
方案1:保留所有原始数据行(含重复ratio)
适用于重复ratio为不同实验样本的场景:
import pandas as pd import numpy as np import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # 读取CSV,指定空格分隔符 df = pd.read_csv('./result.csv', delim_whitespace=True) # 提取X轴值、Y轴阈值、颜色数据 x = df['ratio'].values y = np.array([0.05, 0.1, 0.2, 0.3, 0.4, 0.5]) color_data = df.iloc[:, 1:].values # 生成匹配维度的坐标网格 X, Y = np.meshgrid(x, y, indexing='ij') plt.figure(figsize=(10, 6)) # 按正确顺序传入参数 pcm = plt.pcolormesh(X, Y, color_data, cmap='RdBu') plt.colorbar(pcm, label='数值') plt.xlabel('ratio') plt.ylabel('threshold') plt.xticks(x) plt.yticks(y) plt.title('Ratio与阈值对应热图') plt.show()
方案2:聚合重复ratio的值(取均值)
适用于重复ratio为同一组重复实验的场景:
import pandas as pd import numpy as np import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') df = pd.read_csv('./result.csv', delim_whitespace=True) # 按ratio分组,计算均值聚合 df_agg = df.groupby('ratio').mean().reset_index() x = df_agg['ratio'].values y = np.array([0.05, 0.1, 0.2, 0.3, 0.4, 0.5]) color_data = df_agg.iloc[:, 1:].values X, Y = np.meshgrid(x, y, indexing='ij') plt.figure(figsize=(10, 6)) pcm = plt.pcolormesh(X, Y, color_data, cmap='RdBu') plt.colorbar(pcm, label='均值') plt.xlabel('ratio') plt.ylabel('threshold') plt.xticks(x) plt.yticks(y) plt.title('聚合后Ratio与阈值对应热图') plt.show()
关键修正说明
- 调整
pcolormesh参数顺序为X, Y, C,确保维度匹配。 - 使用
np.meshgrid生成与颜色数据维度一致的坐标网格,indexing='ij'保证行对应X轴、列对应Y轴。 - 添加
delim_whitespace=True确保CSV按空格正确解析列。 - 提供两种重复值处理方案,按需选择。
内容的提问来源于stack exchange,提问作者Codeholic
相关产品推荐
相关产品推荐

