Python生成鼠标热力图遇轴错位、无模糊效果,求优化方案
鼠标热力图解决方案(轴修复+模糊效果+大数据优化)
现有代码核心问题
- 轴错位:你构造的
matrix维度是(x_max+1, y_max+1),但Seaborn热力图默认行对应y轴、列对应x轴,同时屏幕坐标的y轴是从上到下递增,和Matplotlib默认的y轴方向相反,导致显示错位。 - 错误赋值:
matrix[df.x, df.y] = df.index是把索引值赋值给像素,而非统计坐标出现次数,数值逻辑完全错误。 - 无模糊效果:直接基于像素赋值的热力图是离散的,无法实现目标图的平滑Blob效果。
方案一:核密度估计(KDE)实现模糊Blob效果
这是最贴合目标图的方案,无需构造大矩阵,对大数据友好,直接通过2D KDE生成平滑热力图:
import matplotlib.pyplot as plt import pandas as pd import seaborn as sns # 读取数据 df = pd.read_csv(r'C:\Users\Jen\Desktop\mp.csv') # 双显示器参数:两个1650x1050,所以x范围0-3300,y范围0-1050 SCREEN_X_MIN, SCREEN_X_MAX = 0, 1650 * 2 SCREEN_Y_MIN, SCREEN_Y_MAX = 0, 1050 plt.figure(figsize=(16, 10)) # 适配双显示器比例 # 生成2D KDE模糊热力图 sns.kdeplot( data=df, x='X', y='Y', cmap='jet', shade=True, bw_adjust=0.5, # 调整模糊程度:数值越小越锐利,越大越模糊(建议0.3-1之间测试) clip=[(SCREEN_X_MIN, SCREEN_X_MAX), (SCREEN_Y_MIN, SCREEN_Y_MAX)] ) # 反转y轴匹配屏幕坐标体系(屏幕左上角为y=0) plt.ylim(SCREEN_Y_MAX, SCREEN_Y_MIN) plt.xlim(SCREEN_X_MIN, SCREEN_X_MAX) plt.xlabel('X 坐标') plt.ylabel('Y 坐标') plt.title('鼠标热力图(模糊效果)') plt.show()
方案二:优化的精确像素热力图
如果需要统计每个像素的点击频次,用numpy.histogram2d替代手动构造矩阵,效率更高且解决轴错位:
import matplotlib.pyplot as plt import pandas as pd import numpy as np import seaborn as sns df = pd.read_csv(r'C:\Users\Jen\Desktop\mp.csv') SCREEN_X_MIN, SCREEN_X_MAX = 0, 1650 * 2 SCREEN_Y_MIN, SCREEN_Y_MAX = 0, 1050 # 统计每个像素的点击次数 bins_x = np.arange(SCREEN_X_MIN, SCREEN_X_MAX + 1) bins_y = np.arange(SCREEN_Y_MIN, SCREEN_Y_MAX + 1) heatmap, _, _ = np.histogram2d(df['X'], df['Y'], bins=(bins_x, bins_y)) # 转置+反转y轴,匹配热力图的轴方向和屏幕坐标 heatmap = heatmap.T[::-1] plt.figure(figsize=(16, 10)) sns.heatmap( heatmap, cmap='jet', xticklabels=500, # 减少刻度密度,避免拥挤 yticklabels=200, extent=[SCREEN_X_MIN, SCREEN_X_MAX, SCREEN_Y_MIN, SCREEN_Y_MAX] ) plt.xlabel('X 坐标') plt.ylabel('Y 坐标') plt.title('鼠标热力图(精确像素统计)') plt.show()
大数据优化建议
- KDE方案:Seaborn的
kdeplot底层用了高效的核密度算法,13000行数据完全无压力,数据量更大时可通过sample参数降采样(如sample=10000)。 - 像素统计方案:
numpy.histogram2d是C底层实现,比手动循环快100倍以上,若数据量超10万行,可合并像素块(比如每2x2像素合并为一个统计单元)减少计算量。 - 内存优化:避免构造和屏幕分辨率一样大的矩阵,用直方图或KDE替代直接赋值。
内容的提问来源于stack exchange,提问作者JenMo
相关产品推荐
相关产品推荐

