带有大量数据的散点图

Nic*_*llo 16 python numpy matplotlib

我想用Matplotlib生成一个包含大量数据(大约300万个点)的散点图.实际上我有3个具有相同尺寸的矢量,我用以下面的方式绘制.

import matplotlib.pyplot as plt
import numpy as np
from numpy import *
from matplotlib import rc
import pylab
from pylab import * 
fig = plt.figure()
fig.subplots_adjust(bottom=0.2)
ax = fig.add_subplot(111)
plt.scatter(delta,vf,c=dS,alpha=0.7,cmap=cm.Paired)
Run Code Online (Sandbox Code Playgroud)

实际上没什么特别的.但实际生成它需要很长时间(我正在使用Python 2.7和Matplotlib 1.0处理我的MacBook Pro 4 GB RAM).有没有办法提高速度?

unu*_*tbu 20

除非你的图形很大,否则这300万个点中的许多点将会重叠.(400x600图像只有240K点......)

因此,最简单的方法是从您的数据中获取1000分的样本:

import random
delta_sample=random.sample(delta,1000)
Run Code Online (Sandbox Code Playgroud)

并且只是绘制那个.

例如:

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np
import random

fig = plt.figure()
fig.subplots_adjust(bottom=0.2)
ax = fig.add_subplot(111)

N=3*10**6
delta=np.random.normal(size=N)
vf=np.random.normal(size=N)
dS=np.random.normal(size=N)

idx=random.sample(range(N),1000)

plt.scatter(delta[idx],vf[idx],c=dS[idx],alpha=0.7,cmap=cm.Paired)
plt.show()
Run Code Online (Sandbox Code Playgroud)

替代文字

或者,如果您需要更多地关注异常值,那么也许您可以使用np.histogram,然后组合一个delta_sample具有来自每个bin的代表的数据.

不幸的是,在使用时np.histogram我并不认为有任何简单的方法可以将垃圾箱与各个数据点相关联.一个简单但近似的解决方案是使用bin边缘或其上的点的位置作为其中点的代理:

xedges=np.linspace(-10,10,100)
yedges=np.linspace(-10,10,100)
zedges=np.linspace(-10,10,10)
hist,edges=np.histogramdd((delta,vf,dS), (xedges,yedges,zedges))
xidx,yidx,zidx=np.where(hist>0)
plt.scatter(xedges[xidx],yedges[yidx],c=zedges[zidx],alpha=0.7,cmap=cm.Paired)
plt.show()
Run Code Online (Sandbox Code Playgroud)

替代文字


con*_*res 10

那么尝试pyplot.hexbin呢?它根据一定数量的箱子中的点密度生成一种热图.


Pau*_*aul 8

您可以采用此处显示的热图方法.在此示例中,颜色表示bin中的数据量,而不是dS数组的中值,但应该很容易更改.如果你有兴趣,以后再说.

  • 但是,热图对于使用散点图进行异常检测并不是一个好主意。 (2认同)