Efficiently create a density plot for high-density regions, points for sparse regions

后端 未结 4 1293
栀梦
栀梦 2020-12-13 22:01

I need to make a plot that functions like a density plot for high-density regions on the plot, but below some threshold uses individual points. I couldn\'t find any existing

4条回答
  •  我在风中等你
    2020-12-13 22:27

    This should do it:

    import matplotlib.pyplot as plt, numpy as np, numpy.random, scipy
    
    #histogram definition
    xyrange = [[-5,5],[-5,5]] # data range
    bins = [100,100] # number of bins
    thresh = 3  #density threshold
    
    #data definition
    N = 1e5;
    xdat, ydat = np.random.normal(size=N), np.random.normal(1, 0.6, size=N)
    
    # histogram the data
    hh, locx, locy = scipy.histogram2d(xdat, ydat, range=xyrange, bins=bins)
    posx = np.digitize(xdat, locx)
    posy = np.digitize(ydat, locy)
    
    #select points within the histogram
    ind = (posx > 0) & (posx <= bins[0]) & (posy > 0) & (posy <= bins[1])
    hhsub = hh[posx[ind] - 1, posy[ind] - 1] # values of the histogram where the points are
    xdat1 = xdat[ind][hhsub < thresh] # low density points
    ydat1 = ydat[ind][hhsub < thresh]
    hh[hh < thresh] = np.nan # fill the areas with low density by NaNs
    
    plt.imshow(np.flipud(hh.T),cmap='jet',extent=np.array(xyrange).flatten(), interpolation='none', origin='upper')
    plt.colorbar()   
    plt.plot(xdat1, ydat1, '.',color='darkblue')
    plt.show()
    

    image

提交回复
热议问题