显示高密度区域和低密度区域的热图(python)

时间:2015-07-28 12:44:52

标签: python numpy scipy data-visualization heatmap

我有一个数据集我想表示为热图(x,y位置)。有几个区域的密度比该区域的其他区域高得多。这导致这些高密度区域完全清除了较低密度区域的细节。

我认为使用高斯KDE提供最佳表示(并且看起来最好)与2d直方图或等高线图相比,所以更喜欢使用此方法的解决方案。

无法发布图片,因为此帐户的代表少于10个,但是here are some examples of what I've tried

我的代码段基于已发布的片段,我在下面链接而不是重新发布(有些相当冗长),但如果被问到,我会编辑包含它们。

前几个是基于Ivo Bosticky在这个问题中的代码:Efficient method of calculating density of irregularly spaced points。那里的图像是我追求的“风格”。 如上面链接的专辑中所示,由于小的网格化,低密度区域难以制作,没有真正的细节。较高的网格显示出一些splotchier细节,但实际上并不是从高密度到低密度的平滑过渡。将值放在logscale上可以在较低分辨率下清除整个内容,而较高分辨率会显示细节,但不会适当地混合网格。

该专辑中的第二对夫妇基于scipy.stats.gaussian_kde示例。更改gridsize似乎基本上没有任何效果,并且logscale会再次清除它。

所以 TLDR:如何制作能够在高密度和低密度区域平滑显示细节的2D高斯KDE?

2 个答案:

答案 0 :(得分:1)

表示分散数据的最天真的方法是使用散点图。当然,问题是一旦达到某一点密度,散点图就不会提供进一步的信息。在这种情况下,我们使用基于某些KDE的直方图或热图。然而,这些方法总是会删除数据集中密度较小区域的细节。

因此,我建议显示两者的方法是使用你的kde值制作一个散点图。例如。如

pyplot.scatter(your_x,your_y,c=your_kde_value,marker='.',linewidth=0)

此处,your_kde_value是一个数组,其中包含散点图点处KDE函数的值(即它应具有与your_xyour_y相同的形状。

结果可能如下所示(使用来自双变量正态分布的10000点样本:

reference

如您所见,颜色信息提供了中心的所有细节,而我们仍然保留了外围点。

答案 1 :(得分:0)

以下是一个说明我的建议的示例 - 这是基于this matplotlib example:

import matplotlib.pyplot as plt
import numpy as np



# make these smaller to increase the resolution
dx, dy = 0.01, 0.01

# generate 2 2d grids for the x & y bounds
y, x = np.mgrid[slice(1, 5 + dy, dy),
                slice(1, 5 + dx, dx)]

z = np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)

plt.contourf(x,y,z, 20, cmap = 'rainbow')    #change these levels
plt.contour(x,y,z, 5, colors = 'k', linewidths = .25) #and here

plt.show()