首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >海量数据的散点图

海量数据的散点图
EN

Stack Overflow用户
提问于 2010-11-03 05:35:31
回答 3查看 43.6K关注 0票数 19

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

代码语言:javascript
复制
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上工作)。有什么方法可以提高速度吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-03 23:51:18

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

票数 9
EN

Stack Overflow用户

发布于 2010-11-03 05:46:46

除非您的图形很大,否则这300万个点中的许多点都会重叠。(一张400x600的图像只有24万个点...)

所以最简单的做法是从你的数据中抽取1000个点的样本:

代码语言:javascript
复制
import random
delta_sample=random.sample(delta,1000)

然后画出来。

例如:

代码语言:javascript
复制
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边中或其上的点的位置作为其中点的代理:

代码语言:javascript
复制
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()

票数 27
EN

Stack Overflow用户

发布于 2010-11-11 00:14:45

试试pyplot.hexbin怎么样?它基于一定数量的存储箱中的点密度生成一种热图。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4082298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档