Python读取CSV绘制自定义色阶平滑热力图问题排查
平滑热力图实现方案
原代码问题排查
原代码同时存在语法错误和逻辑错误,是输出异常直线的核心原因:
- 语法类错误:多处赋值符号错写为减号(
Z2 - ...应为Z2 = ...)、方法调用漏括号(data.ravel应为data.ravel())、参数拼写错误(cmaprcm.jet应为cmap=cm.jet)、变量大小写混用(定义大写X后调用小写x)、语句未正确断行(z = ZD.ravel gridsize=10为两个独立语句) - 逻辑类错误:
- 照搬官方测试demo的模拟数据逻辑,
bivariate_normal是用来生成二维正态分布测试数据的函数,不需要套用到自有CSV真实数据上 - 向bivariate_normal传入的x、y参数为完全相同的
data数组,最终计算得到的坐标满足x=y,自然只会输出一条直线 ZD = Z2 - 21为笔误,原demo逻辑为Z2-Z1hexbin本身是六边形分箱绘图接口,输出为蜂窝状色块,无法实现连续平滑的热力图效果
- 照搬官方测试demo的模拟数据逻辑,
正确实现代码
要实现无硬方块边缘、数值越高颜色越暖(0对应蓝色、高值对应暖红/橙色)的平滑热力图,可通过「原始网格数据+高斯平滑+插值渲染」实现,无需生成模拟正态数据或调用hexbin接口:
import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy.ndimage import gaussian_filter from matplotlib import cm # 读取CSV数据,根据自己的文件格式调整读取参数 # 若CSV无表头、纯数值存储:df = pd.read_csv("your_file.csv", header=None).values df = pd.read_csv("your_file.csv", index_col=0) z_raw = df.values # 生成坐标网格,若CSV自带x/y轴坐标,替换为对应实际值即可 x = np.arange(z_raw.shape[1]) y = np.arange(z_raw.shape[0]) xx, yy = np.meshgrid(x, y) # 高斯平滑处理,sigma越大平滑效果越强,建议在1-3区间调试 z_smoothed = gaussian_filter(z_raw, sigma=1.8) # 绘图配置 plt.figure(figsize=(8, 6)) im = plt.pcolormesh( xx, yy, z_smoothed, cmap=cm.coolwarm, # 冷蓝到暖红的色阶,符合映射规则 vmin=0, vmax=20, # 固定色阶范围:0对应蓝色,20对应最高暖色调 shading='gouraud' # *关键参数*:实现颜色插值过渡,消除方块硬边缘 ) plt.colorbar(im, label='数值') plt.xlim(x.min(), x.max()) plt.ylim(y.min(), y.max()) plt.tight_layout() plt.show()
参数调整提示
- 平滑度不符合预期时,调整
sigma值:数值越大画面越平滑,数值越小越接近原始方块效果 - 色阶风格可通过替换
cmap参数调整,比如使用cm.RdYlBu_r可实现蓝-黄-红的更鲜明冷暖递进 - 若CSV存储的是离散点数据而非网格数据,可将高斯平滑替换为
scipy.interpolate.Rbf径向基插值,生成连续网格后再绘图
内容的提问来源于stack exchange,提问作者DanielShvartz
相关产品推荐
相关产品推荐

