You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python生成点击数据热力图并叠加原图的问题求助

图片点击热力图生成问题解决方案

问题分析

  1. 位置错位:点击数据的y轴是从下到上递增,而matplotlib.imshow默认origin='upper'(y轴从上到下递增),导致热力图与原图、散点图的坐标系统不匹配。
  2. 热力强度不足:当前高斯滤波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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 02:07:39