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

2024-09-30 01:25:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据集,我想用热图来表示(x,y位置)。有几个地区的密度比其他地区高得多。这导致了这些高密度区域完全洗掉了低密度区域的细节。在

我认为与2d直方图或等高线图相比,使用Gaussian KDE提供了最好的表示(而且看起来也最漂亮),所以更喜欢使用这种方法的解决方案。在

我无法发布图片,因为这个帐号的重复次数少于10次,但是here are some examples of what I've tried。在

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

前几个基于Ivo Bosticky在这个问题中的代码:Efficient method of calculating density of irregularly spaced points。那里的图像是我追求的“风格”。 如上面链接的相册所示,由于网格尺寸较小,低密度区域很难辨认,没有真实的细节。较高的网格大小显示了一些斑点细节,但实际上不是从高密度到低密度的平滑过渡。将值放在logscale上会在较低的分辨率上洗掉整个事情,而高分辨率则会显示细节,但不会适当地混合网格。在

该相册中的第二对基于scipy.stats.gaussian_kde示例。更改gridsize似乎基本上没有效果,logscale再次将其洗刷干净。在

那么TLDR:我如何制作一个二维高斯KDE,在高密度和低密度区域平滑地显示细节?在


Tags: of数据代码网格区域链接直方图细节
2条回答

下面是一个例子来说明我的建议-这是基于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()

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

因此,我的建议是用kde值来着色散点图。E、 g.作为

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

这里,your_kde_value是一个数组,包含散点图上KDE函数的值(即,它应该具有与your_xyour_y相同的形状。在

结果可能如下(使用双变量正态分布中的10000个点样本:

enter image description here

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

相关问题 更多 >

    热门问题