Python 包含大量数据的散点图

Python 包含大量数据的散点图,python,numpy,matplotlib,Python,Numpy,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.a

我想用它来生成一个包含大量数据(大约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)

其实没什么特别的。但实际生成它需要花费太长时间(我正在使用Python 2.7和Matplotlib 1.0开发MacBook Pro 4 GB RAM)。有什么方法可以提高速度吗?

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

因此,最简单的方法是从您的数据中抽取1000个点作为样本:

import random
delta_sample=random.sample(delta,1000)
就这样策划吧

例如:

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

或者,如果您需要更加注意异常值,那么您可以使用
np.直方图
对数据进行分类,然后组成一个
delta_样本
,其中包含每个分类单元的代表

不幸的是,当使用
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()

您可以采用所示的热图方法。在本例中,颜色表示bin中的数据量,而不是dS数组的中值,但这应该很容易更改。如果您感兴趣,请稍后再试。

试一试怎么样?它会根据一定数量的箱子中的点密度生成一种热图。

要完成解决方案,如果要随机取样,请进行N次,以获得整个情况。实际上,我也认为装箱数据可能是最简单的方法。你能告诉我怎么做吗(保存三个向量的箱子之间的对应关系?我指的是一种3D直方图)非常感谢。事实上,我认为我没有正确地解释我自己。我想创建一个colormap,以便颜色指示bin(xbin,ybin)中变量z的平均值,以便将其绘制为imshow。我认为这与np.historogramdd不同。也许有人可以帮助我,除了数万个点之外,为了速度和实际可用性,某种形式的光栅图可能更可取。你应该选择一个答案并将其标记为已接受。但是,对于使用散点图进行异常检测,热图不是一个好主意。@ChHaXam很好。但是,您可以在热图的顶部覆盖一个散点图(异常值),并充分利用两者。