2016-03-06 103 views
0

我是Python的新手,并且在matplotlib中遇到了一些麻烦。我目前有两个numpy数组中包含的数据,称它们为x和y,我正在散点图上绘制每个点(x,y)的坐标(即,我有点x [0],y [0]和x 1,y 1等等)。我一直在使用下面的代码段基础上的相邻点的空间密度(找到另一计算器后)我的散点图来着色点:Matplotlib:按照相对于另一个数据集的密度着色散点图

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中的点的密度的比较。有人能解释我该如何去做这件事吗?

在此先感谢您的帮助!

回答

0

我一直试图做同样的事情基于相同的早期文章,我想我只是想通了!诀窍是根据一些数据集(xnorm,ynorm)使用matplotlib.colors.Normalize()以限定比例,然后加权它:

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我的数据缩放到一些比较数据(位于该图像的底部)。

我不知道这种方法是完全通用的,但它的作品在我的情况:我知道,我的数据和比较数据在参数空间相似的地区,它们都具有高斯散射,这样我就可以使用由数据点的数量决定的一种天真的线性缩放比例,并且它可以在视觉上给出正确的想法。