Python 散点图最密集区域的打印等高线

Python 散点图最密集区域的打印等高线,python,numpy,matplotlib,scipy,contour,Python,Numpy,Matplotlib,Scipy,Contour,我正在生成一个约300k数据点的散点图,并且有一个问题,即在某些地方过于拥挤,以至于看不到任何结构-所以我有一个想法 我想让绘图为最密集的部分生成一个等高线图,并用scatter()数据点保留密度较低的区域 所以我试着分别计算每个数据点的最近邻距离,然后当这个距离达到一个特定值时,画一个轮廓并填充它,然后当它达到一个更大的值(密度更小)时,只做散射 我已经尝试了几天,但失败了,我不确定传统的等高线图在这种情况下是否有效 我会提供代码,但它是如此混乱,可能只是混淆了问题。而且它的计算量非常大,如果

我正在生成一个约300k数据点的散点图,并且有一个问题,即在某些地方过于拥挤,以至于看不到任何结构-所以我有一个想法

我想让绘图为最密集的部分生成一个等高线图,并用
scatter()
数据点保留密度较低的区域

所以我试着分别计算每个数据点的最近邻距离,然后当这个距离达到一个特定值时,画一个轮廓并填充它,然后当它达到一个更大的值(密度更小)时,只做散射

我已经尝试了几天,但失败了,我不确定传统的等高线图在这种情况下是否有效

我会提供代码,但它是如此混乱,可能只是混淆了问题。而且它的计算量非常大,如果它能工作的话,我的电脑可能会崩溃

提前谢谢大家

p、 我一直在寻找答案!我确信它甚至不可能出现所有的结果

编辑:这样做的目的是查看300k样本结构中某些特定点的位置。这是一个示例图,我的点分散在三种不同的颜色中。

我将尝试从我的数据中随机抽取1000个数据点,并将其作为文本文件上传。 干杯,堆垛工。:)

编辑:嘿, 以下是一些示例数据1000行-仅两列
[X,Y]
(或
[g-i,i]
(来自上面的绘图)空格分隔。谢谢大家!!

您可以使用各种numpy/scipy/matplotlib工具实现这一点:

  • 创建一组原始点以进行快速查找
  • 用于以轮廓所需的分辨率创建点栅格
  • 用于创建目标密度内所有位置的遮罩
  • Bin使用矩形Bin或
  • 根据装箱数据绘制轮廓,但使用步骤3中的遮罩。过滤掉低密度区域
  • 使用与其余点相反的遮罩

  • 4年后,我终于可以回答这个问题了! 这可以通过使用来完成

    我使用了高斯平滑,可以根据需要省略或替换

    import matplotlib.colors as colors
    from matplotlib import path
    import numpy as np
    from matplotlib import pyplot as plt
    try:
        from astropy.convolution import Gaussian2DKernel, convolve
        astro_smooth = True
    except ImportError as IE:
        astro_smooth = False
    
    np.random.seed(123)
    t = np.linspace(-1,1.2,2000)
    x = (t**2)+(0.3*np.random.randn(2000))
    y = (t**5)+(0.5*np.random.randn(2000))
    
    H, xedges, yedges = np.histogram2d(x,y, bins=(50,40))
    xmesh, ymesh = np.meshgrid(xedges[:-1], yedges[:-1])
    
    # Smooth the contours (if astropy is installed)
    if astro_smooth:
        kernel = Gaussian2DKernel(stddev=1.)
        H=convolve(H,kernel)
    
    fig,ax = plt.subplots(1, figsize=(7,6)) 
    clevels = ax.contour(xmesh,ymesh,H.T,lw=.9,cmap='winter')#,zorder=90)
    
    # Identify points within contours
    p = clevels.collections[0].get_paths()
    inside = np.full_like(x,False,dtype=bool)
    for level in p:
        inside |= level.contains_points(zip(*(x,y)))
    
    ax.plot(x[~inside],y[~inside],'kx')
    plt.show(block=False)
    
    也许有人(像我一样)会在互联网上无意中寻找答案@FriskyGrub,我喜欢你的平滑方法。AstroML库中有一个解决方案,例如。我不确定您如何在代码中设置阈值(高于该阈值,将在轮廓中包含点,而不是分散),但我成功地通过以下方法重现了与您类似的结果:

    import matplotlib.pyplot as plt
    from astroML.plotting import scatter_contour
    np.random.seed(123)
    t = np.linspace(-1,1.2,2000)
    x = (t**2)+(0.3*np.random.randn(2000))
    y = (t**5)+(0.5*np.random.randn(2000))
    fig,ax = plt.subplots(1,1,figsize=(6,6))
    scatter_contour(x,y, threshold=15, log_counts=True, ax=ax,
                histogram2d_args=dict(bins=15),
                plot_args=dict(marker='+', linestyle='none', color='black',
                              markersize=5),
                contour_args=dict(cmap='winter',),
               filled_contour=False)
    

    scatter\u contour???
    提供了很多文档帮助,但基本上正如kwargs所建议的,
    historogram2d\u args
    是由
    numpy获取的args。historogram2d
    plt\code>是由scatter
    plt.plot
    获取的args,
    contour\u args
    是由
    plt.contour获取的args(或
    plt.contourf

    祝福


    Chris

    根据这些值的拥挤程度,您可能可以通过执行
    分散(x,y,alpha=0.1)
    或一些合适的小值来梳理出一些结构。要执行您的建议,我将构建一个内核密度估计(请参见
    scipy.stats.kde
    )。为什么不使用2d柱状图来显示数据?@FriskyGrub您可以提供与真实数据类型/形状/等相同的随机数据-您不必总是在第一时间发布生成真实数据的复杂步骤。这使我们更容易给出对您有用的答案。@RutgerKassies-这不是真的以有意义的方式显示该数据,并且会出现装箱问题。此外,很难在打印输出中正确表示该数据。@FriskyGrub“无法真正以有意义的方式显示该数据,并且会出现装箱问题。此外,很难在打印输出中正确表示该数据。”-这是什么意思?直方图是表示分布质量的一种完全有效的方法。绘制300000个云中每个x,y点的确切位置绝对不会有什么好处,因为这些点彼此重叠。要找到一个看起来不错的彩色地图并不难一个打印输出。我没有直接尝试过,但这基本上就是我最后做的。我求助于使用hexbin“热图”,因为我无法减少等高线的计算时间,从n^n-u-…的顺序来看,这可能是一个值得回顾的有趣问题。