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

清晰显示高密度和低密度区域的热图(python),python,numpy,scipy,data-visualization,heatmap,Python,Numpy,Scipy,Data Visualization,Heatmap,我有一个数据集,我想表示为热图(x,y位置)。有几个地区的人口密度比该地区其他地区高得多。这是因为这些高密度区域完全洗掉了低密度区域的细节 我认为与二维直方图或等高线图相比,使用高斯KDE提供了最好的表示(并且看起来最好),因此我更喜欢使用这种方法的解决方案 我无法发布图像,因为此帐户的rep少于10个,但是 我的代码片段基于我在下面链接的已经发布的代码片段,而不是重新发布的代码片段(有些代码片段相当长),但如果有人问我,我会进行编辑以包含它们 前几个基于Ivo Bosticky在这个问题上的代

我有一个数据集,我想表示为热图(x,y位置)。有几个地区的人口密度比该地区其他地区高得多。这是因为这些高密度区域完全洗掉了低密度区域的细节

我认为与二维直方图或等高线图相比,使用高斯KDE提供了最好的表示(并且看起来最好),因此我更喜欢使用这种方法的解决方案

无法发布图像,因为此帐户的rep少于10个,但是

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

前几个基于Ivo Bosticky在这个问题上的代码:。那里的图像就是我所追求的“风格”。 如上面链接的相册所示,由于网格尺寸较小,很难分辨出低密度区域,没有真正的细节。更高的网格尺寸会显示一些斑点细节,但实际上并不是从高密度到低密度的平滑过渡。将值放在对数刻度上会在较低的分辨率上洗掉整个内容,而在较高的分辨率下会显示细节,但不会适当地混合网格

那张专辑中的第二对是以这个例子为基础的。更改gridsize似乎基本上没有效果,而logscale再次将其全部清除


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

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

因此,我的建议是,用kde值绘制一个散点图。例如,作为

pyplot.scatter(your_x,your_y,c=your_kde_value,marker='.',linewidth=0)
这里,
您的_kde_值
是一个数组,包含散点图点处的kde函数值(即,它应具有与
您的_x
您的_y
相同的形状)

结果可能如下所示(使用来自二元正态分布的10000个点的样本:


正如您所看到的,颜色信息提供了中心的所有细节,而我们仍然保留了边远点。

下面的示例说明了我的建议-这是基于


你可以考虑的一个选项是把一个散点图放在一个填满的等高线图上。比如,过滤散布的数据以满足一些标准,并且基本上在填充轮廓上叠加。实际上我已经完成了,填充轮廓线显示了我所有尝试中的细节。然而,它有虚假的虚假的伪影。g数据(例如,始终显示非该形状区域周围的菱形)。我还试图避免显示此特定绘图的各个点,因此避免散点绘图。我通常使用重叠的线等高线绘制填充等高线,并强制使用相同数量的等高线。也许如果您执行类似操作,但强制使用不同的数度?例如填充等高线有50个,线有10个?您可以n还要在线条上做内嵌标签,以指示水平。我不确定这是否有助于解决我提到的问题。感谢您的回答。我不确定这是否能很好地工作,因为有些区域没有数据,有些区域只有分散的点(即相当低的密度).我更喜欢覆盖整个空间的平滑渐变。不管怎样,我会尝试你的建议,然后再回复你。同时作为一般性评论(新手),按照惯例,我会投票支持你的答案,因为这是解决我的问题的合法尝试,并提供了一个很好的例子,还是因为它不完全是我想要的?Funkosaurus你可以投票支持你认为有帮助的每一个答案,然后“接受”只有一个答案最能回答您的问题。因此,如果您有10个答案,其中5个是有帮助的,其中一个是最好的,您可以在5个答案上投票,然后接受最好的一个。@Christoph我用您的语法尝试了您的建议,但一直遇到错误。“您的值”我使用的变量与我使用imshow绘制相册图像时使用的变量相同。错误:ValueError:to_rgba:Invalid rgba arg“[数字列表]”rgba序列的长度应为3或4。@Funkosaurus:您需要计算样本点上KDE的值,而不是提供网格。然后,您将这些点上的KDE值数组提供给plot命令。我将编辑我的帖子以澄清
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()