Python生成点击数据热力图并叠加原图的问题求助
图片点击热力图生成问题解决方案
问题分析
- 位置错位:点击数据的y轴是从下到上递增,而
matplotlib.imshow默认origin='upper'(y轴从上到下递增),导致热力图与原图、散点图的坐标系统不匹配。 - 热力强度不足:当前高斯滤波sigma值偏小,且未对热力图做对比度增强,导致效果不明显。
修改后的代码
import numpy as np import matplotlib.pyplot as plt import pandas as pd import imageio.v2 as imageio from scipy.ndimage import gaussian_filter # 读取原图 image_path = 'C:\\Users\\Anurag\\Desktop\\Heatmaps\\Original design\\Holi control_withPrice1.png' image = imageio.imread(image_path) img_height, img_width = image.shape[:2] # 读取点击数据 clicks_file = 'C:\\Users\\Anurag\\Desktop\\Heatmaps\\clickfiles\\Study1_Q19_1stArea.csv' clicks_data = pd.read_csv(clicks_file) x = clicks_data['x'].values y = clicks_data['y'].values # 转换y坐标:将点击数据的y(下到上)转换为matplotlib的y(上到下) y_converted = img_height - y # --- 修正后的散点图 --- plt.clf() plt.imshow(image, extent=[0, img_width, 0, img_height], origin='upper', alpha=0.3) plt.scatter(x, y_converted, c='red', s=40, alpha=0.5) plt.show() # --- 修正后的热力图 --- # 生成二维直方图,bins匹配图片尺寸 heatmap, xedges, yedges = np.histogram2d(x, y_converted, bins=(img_width, img_height)) # 增大sigma值,提升模糊扩散效果 heatmap = gaussian_filter(heatmap, sigma=25) plt.clf() # 先绘制原图 plt.imshow(image, extent=[0, img_width, 0, img_height], origin='upper', alpha=0.3) # 绘制热力图,统一origin为upper,调整透明度和颜色映射范围增强对比度 plt.imshow(heatmap.T, extent=[0, img_width, 0, img_height], origin='upper', alpha=0.6, cmap='jet', vmin=0, vmax=np.percentile(heatmap, 95)) plt.show()
关键修改点说明
1. 坐标系统统一
- 将点击数据的y值转换为
img_height - y,把“下到上”的坐标转换为matplotlib默认的“上到下”坐标,确保散点、热力图与原图完全对齐。 - 热力图绘制时统一使用
origin='upper',避免转置后的坐标混乱。
2. 提升热力强度
- 增大
gaussian_filter的sigma值(从16改为25),让热力区域更扩散、明显。 - 添加
vmin=0, vmax=np.percentile(heatmap, 95),截断热力图的最高值,提升整体对比度,避免少数高点击区域掩盖其他区域的热力效果。 - 调整热力图的
alpha值(从0.5改为0.6),让热力层更突出。
内容的提问来源于stack exchange,提问作者Anurag Yadav
相关产品推荐
相关产品推荐

