Matplotlib:按密度相对于另一个数据集着色散点图

时间:2016-03-06 02:34:55

标签: python matplotlib

我是Python的新手,在使用matplotlib方面遇到了一些麻烦。我目前有数据包含在两个numpy数组中,称为x和y,我正在绘制一个散点图,每个点(x,y)的坐标(即我有点x [0],y [0]我的情节中有x 1,y 1等等。我一直在使用以下代码段根据附近点的空间密度为散点图中的点着色(在另一个stackoverflow帖子上找到):

http://prntscr.com/abqowk

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde

x = np.random.normal(size=1000)
y = x*3 + np.random.normal(size=1000)

xy = np.vstack([x,y])
z = gaussian_kde(xy)(xy)

idx = z.argsort()

fig,ax = plt.subplots()
ax.scatter(x,y,c=z,s=50,edgecolor='')
plt.show()

输出:

output

我一直在使用它而不确定它是如何工作的(即点密度计算 - 如果有人可以解释它究竟是如何工作的,也会非常感激)。

然而,现在我想通过x,y中的点的空间密度与另一组numpy数组中的点的空间密度的比率来对代码进行着色,将它们称为x2,y2。也就是说,我想制作一个图,以便我可以确定x,y中的点密度如何与同一散点图上的x2,y2中的点相比较。有人可以解释我怎么能这样做吗?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我一直在尝试基于同样的早期帖子做同样的事情,我想我只是想出来了!诀窍是使用matplotlib.colors.Normalize()来定义比例,然后根据某些数据集(xnorm,ynorm)对其进行加权:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mplc
import matplotlib.cm as cm
from scipy.stats import gaussian_kde

def kdeplot(x,y,xnorm,ynorm):
    xy = np.vstack([x,y])
    z = gaussian_kde(xy)(xy)

    wt = 1.0*len(x)/(len(xnorm)*1.0)
    norm = mplc.Normalize(vmin=0, vmax=8/wt)
    cmap = cm.gnuplot

    idx = z.argsort()
    x, y, z = x[idx], y[idx], z[idx]

    args = (x,y)
    kwargs = {'c':z,'s':10,'edgecolor':'','cmap':cmap,'norm':norm}

    return args, kwargs

# (x1,y1) is some data set whose density map coloring you 
# want to scale to (xnorm,ynorm)
args,kwargs = kdeplot(x1,y1,xnorm,ynorm)
plt.scatter(*args,**kwargs)

我使用了试验和错误来优化我的特定数据的标准化和色彩映射的选择。 Here's我的数据看起来像是自己缩放的; here's我的数据缩放到某些比较数据(位于该图像的底部)。

我不确定这种方法是否完全一般,但它适用于我的情况:我知道我的数据和比较数据在参数空间的相似区域,并且它们都有高斯散射,所以我可以使用由数据点数量决定的天真线性缩放,它会产生一些可视化的正确想法。