在matplotlib中重叠点的散点图的可视化

mar*_*ian 22 python plot visualization matplotlib scatter-plot

我必须在matplotlib的散点图中表示大约30,000个点.这些点属于两个不同的类,所以我想用不同的颜色描绘它们.

我成功了,但是有一个问题.这些点在许多地区重叠,我最后描绘的类将在另一个上面可视化,隐藏它.此外,散点图无法显示每个区域中有多少点.我还试图用histogram2d和imshow制作一个二维直方图,但很难以清晰的方式显示属于这两个类的点.

你能否提出一种方法来明确课程的分布和分数的集中?

编辑:更清楚,这是我的数据文件的 链接,格式为"x,y,class"

tom*_*m10 26

一种方法是将数据绘制为具有低α散点图,因此您可以看到各个点以及密度的粗略度量.(这方面的缺点是该方法可以显示有限的重叠范围 - 即最大密度约为1/alpha.)

这是一个例子:

在此输入图像描述

可以想象,由于可以表达的重叠范围有限,因此需要在各个点的可见性与重叠量的表达(以及标记的大小,图等)之间进行权衡.

import numpy as np
import matplotlib.pyplot as plt

N = 10000
mean = [0, 0]
cov = [[2, 2], [0, 2]]
x,y = np.random.multivariate_normal(mean, cov, N).T

plt.scatter(x, y, s=70, alpha=0.03)
plt.ylim((-5, 5))
plt.xlim((-5, 5))
plt.show()
Run Code Online (Sandbox Code Playgroud)

(我假设你在这里意味着30e3点,而不是30e6.对于30e6,我认为某种类型的平均密度图是必要的.)


小智 18

您还可以通过首先计算散射分布的核密度估计值,并使用密度值为散点的每个点指定颜色来对点进行着色.要修改前面示例中的代码:

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

N = 10000
mean = [0,0]
cov = [[2,2],[0,2]]

samples = np.random.multivariate_normal(mean,cov,N).T
densObj = kde( samples )

def makeColours( vals ):
    colours = np.zeros( (len(vals),3) )
    norm = Normalize( vmin=vals.min(), vmax=vals.max() )

    #Can put any colormap you like here.
    colours = [cm.ScalarMappable( norm=norm, cmap='jet').to_rgba( val ) for val in vals]

    return colours

 colours = makeColours( densObj.evaluate( samples ) )

 plt.scatter( samples[0], samples[1], color=colours )
 plt.show()
Run Code Online (Sandbox Code Playgroud)

带有密度信息的散点图

不久之前,当我注意到散射函数的文档时,我学会了这个技巧 -

c : color or sequence of color, optional, default : 'b'
Run Code Online (Sandbox Code Playgroud)

c可以是单色格式字符串,或长度的颜色规范序列N,或N使用cmapnorm指定的kwargs(见下文)映射到颜色的一系列数字.请注意,c不应该是单个数字RGB或RGBA序列,因为它与要进行颜色映射的值数组无法区分. c可以是行为RGB或RGBA的二维数组,但是,包括为所有点指定相同颜色的单行的情况.

  • 对于绘制大型数据集时最常遇到的问题之一,这是一个惊人的解决方案。优秀作品! (3认同)