我想用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)其实没什么特别的。但实际生成它需要太长时间(我正在使用Python2.7和Matplotlib1.0在我的MacBook专业版4GBRAM上工作)。有什么方法可以提高速度吗?
发布于 2010-11-03 23:51:18
您可以采用here所示的热图方法。在本例中,颜色表示bin中的数据量,而不是dS数组的中值,但这应该很容易更改。如果您感兴趣,稍后会有更多信息。
发布于 2010-11-03 05:46:46
除非您的图形很大,否则这300万个点中的许多点都会重叠。(一张400x600的图像只有24万个点...)
所以最简单的做法是从你的数据中抽取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.histogram对数据进行二进制,然后组成一个具有来自每个二进制的代表的delta_sample。
不幸的是,在使用np.histogram时,我不认为有任何简单的方法可以将bin与单个数据点相关联。一种简单但近似的解决方案是使用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()

发布于 2010-11-11 00:14:45
试试pyplot.hexbin怎么样?它基于一定数量的存储箱中的点密度生成一种热图。
https://stackoverflow.com/questions/4082298
复制相似问题