Python Matplotlib:根据相对于另一个数据集的密度为散点图着色

Python Matplotlib:根据相对于另一个数据集的密度为散点图着色,python,matplotlib,Python,Matplotlib,我是Python新手,在matplotlib方面遇到了一些问题。目前,我有两个numpy数组中包含的数据,称为x和y,我在散点图上绘制,每个点(x,y)都有坐标(即我的图上有点x[0],y[0]和x,y等等)。我一直在使用以下代码段,根据附近点的空间密度(在另一个stackoverflow帖子上发现)为散点图中的点上色: 输出: 我一直在使用它,但不确定它到底是如何工作的(即点密度计算-如果有人能解释它到底是如何工作的,我也将不胜感激) 但是,现在我想用x,y中点的空间密度与另一组numy数

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

输出:

我一直在使用它,但不确定它到底是如何工作的(即点密度计算-如果有人能解释它到底是如何工作的,我也将不胜感激)

但是,现在我想用x,y中点的空间密度与另一组numy数组中点的空间密度之比来进行颜色编码,称它们为x2,y2。也就是说,我想绘制一个图,这样我就可以确定x,y中的点的密度与同一散点图上x2,y2中的点的密度相比如何。有人能解释一下我该怎么做吗


提前感谢您的帮助

我一直在尝试根据之前的帖子做同样的事情,我想我已经明白了!诀窍是使用
matplotlib.colors.Normalize()
定义刻度,然后根据某些数据集(xnorm,ynorm)对其进行加权:

我使用了反复试验的方法来优化我对特定数据的标准化,并选择了彩色地图。我的数据看起来是什么样的;我的数据缩放到一些比较数据(位于该图像底部)


我不确定这种方法是否完全通用,但它适用于我的情况:我知道我的数据和比较数据在参数空间的相似区域,它们都有高斯散射,因此,我可以使用由数据点的数量决定的简单线性缩放,它可以在视觉上给出正确的想法。

我一直在尝试根据之前的文章做同样的事情,我想我刚刚找到了答案!诀窍是使用
matplotlib.colors.Normalize()
定义刻度,然后根据某些数据集(xnorm,ynorm)对其进行加权:

我使用了反复试验的方法来优化我对特定数据的标准化,并选择了彩色地图。我的数据看起来是什么样的;我的数据缩放到一些比较数据(位于该图像底部)

我不确定这种方法是否完全通用,但它在我的例子中是有效的:我知道我的数据和比较数据在参数空间的相似区域,它们都有高斯散射,所以我可以使用由数据点数量确定的简单线性标度,它可以在视觉上给出正确的想法

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()
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)