【问题标题】:Pyplot Scatter to Contour plotPyplot 散点图到等高线图
【发布时间】:2016-02-20 23:51:23
【问题描述】:

我正在使用 pyplot 从 python 中的数千个点制作散点图。我的问题是他们倾向于集中在一个地方,而这只是一个巨大的点。

是否有某种功能可以使 pyplot 绘图点达到某个临界密度,然后使其成为等高线图?

我的问题类似于this one,示例图有等高线,其中颜色代表绘制点的密度。

这就是我的数据的样子

【问题讨论】:

  • 您可能不必进行切换。如果点是松散的,那么轮廓线将不会太明显,但点本身会传达信息。但是,如果点很密集,如上图所示,那么它们将创建一个漂亮的背景,在该背景上应该可以看到 contour。所以我建议首先使用带有填充标记的scatter,然后在上面使用contour。您只需要定义一个密度即可contour 绘图。如果这对您不起作用,然后尝试切换,可能切换到contourf
  • 为什么不直接减小点的大小?还是使用一些透明度可以有效地为您提供灰度密度?

标签: python numpy matplotlib plot


【解决方案1】:

首先,您需要对数据进行密度估计。根据你选择的方法,可以得到varying result

假设你想做高斯密度估计,基于scipy.stats.gaussian_kde的例子,你可以得到密度高度:

def density_estimation(m1, m2):
    X, Y = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]                                                     
    positions = np.vstack([X.ravel(), Y.ravel()])                                                       
    values = np.vstack([m1, m2])                                                                        
    kernel = stats.gaussian_kde(values)                                                                 
    Z = np.reshape(kernel(positions).T, X.shape)
    return X, Y, Z

然后,您可以使用contour 来绘制它

X, Y, Z = density_estimation(m1, m2)

fig, ax = plt.subplots()                   

# Show density 
ax.imshow(np.rot90(Z), cmap=plt.cm.gist_earth_r,                                                    
          extent=[xmin, xmax, ymin, ymax])

# Add contour lines
plt.contour(X, Y, Z)                                                                           

ax.plot(m1, m2, 'k.', markersize=2)    

ax.set_xlim([xmin, xmax])                                                                           
ax.set_ylim([ymin, ymax])                                                                           
plt.show()

作为替代方案,您可以根据here 所示的密度更改标记颜色。

【讨论】:

  • 您好,谢谢您的回答!看起来它卡在了'Z = np.reshape(kernel(positions).T, X.shape)' 行。还有其他方法可以做类似的事情吗?
  • 这会引发错误消息:NameError: global name 'xmin' is not defined。我假设应该是min(m1)
  • 是的,他们没有在这个sn-p中定义。它们来自gaussian_kde 函数的引用。
  • 如果您在函数内交换所有 x 和 y,则无需旋转即可进行绘图。对我来说,这似乎有点简单