我有一个数据集我想表示为热图(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?
答案 0 :(得分:1)
表示分散数据的最天真的方法是使用散点图。当然,问题是一旦达到某一点密度,散点图就不会提供进一步的信息。在这种情况下,我们使用基于某些KDE的直方图或热图。然而,这些方法总是会删除数据集中密度较小区域的细节。
因此,我建议显示两者的方法是使用你的kde值制作一个散点图。例如。如
pyplot.scatter(your_x,your_y,c=your_kde_value,marker='.',linewidth=0)
此处,your_kde_value
是一个数组,其中包含散点图点处KDE函数的值(即它应具有与your_x
和your_y
相同的形状。
结果可能如下所示(使用来自双变量正态分布的10000点样本:
如您所见,颜色信息提供了中心的所有细节,而我们仍然保留了外围点。
答案 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()