散点图应该是我们做可视化时候接触到的第一个图形,无论是在R语言还是在Python的可视化图形里面,默认的方法都是采用散点图的,比如下面这样:
这是R语言默认plot函数直接就画出来的散点图。
很多时候,虾神我都用散点图来作为R语言的hello world,如下:
只要能够弹出来图形来,就说明R语言基本正常了。
所以,散点图可能是我们搞可视化专题图所接触的第一个图形了(也有同学说:俺们第一个玩的是柱状图……好吧,excel路过的,不要在意这些细节……)
散点图是用两组坐标来考察分布的东西,所以需要有X\Y两组数据,所以考察两组数据间的关系的散点图最大优势也是它最大的问题,就是在平面上只能考察两组数据……
所以,今天我们来讲讲三维散点图。
不说话,先看效果:
这是正面图,由三个图层组成,各种颜色的点表示地震的位置,背景是世界地图,线是核密度之后提取的等值线。通过这张图,可以很清晰的对三个地震带进行识别,密度最高的环太平洋地震带,然后是几乎都在陆地上的欧亚地震带,以及线性特征明显的海岭地震带。
当我们对地图进行前后翻转90度——
地震带的深度也被展示出来了。按照通用的分类方法,深度在60公里以内的称之为浅源地震,60—300公里的,叫做中源地震,超过300公里的,叫做深源地震。
从上面这张图上除了可以看出浅源地震的数量 > 中源 > 深源以外,还可以很明显的看出,浅源地震的分布普遍比较分散,而中源就明显的产生了聚集,到了深源,主要就集中在固定的地震带上(环太平洋)了。
然后从其他几个角度再来看看:
看完了效果,下面就来说说这东东是怎么实现的了。
Python下面的可视化包很多,但是最最出名的,自然就是matplotlib了。这个包在python可视化界的地位,和Shapefile在GIS数据格式界的地位一样,称之为“事实上的标准”或者是“无冕之王”。
在说之前,先来缅怀一下这位matplotlib之父——John Hunter
John Hunter博士毕业于普林斯顿大学,是著名的计算机图形学专家和可视化专家,可惜英年早逝。当然,虽然他走了,但是开源的事业还在被更多的爱好者和程序们继续着,所以大家不用担心这个包会挂掉。
关于更多的matplotlib的内容,可以查看其官方主页:/ 到我写这篇文章为止,最新的版本是1.5.3。
下面就简单说说matplotlib的三维散点图怎么做:
贴部分代码和注释,有兴趣的同学可以问我要数据和源代码
def s3dDemo1():
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
#下面这段话,是利用numpy包读取csv里面的数据,然后分别取出X\Y\Z三维值
eq = np.loadtxt(csvfile, dtype=np.str,delimiter=",")
data = eq[1:,0:].astype(np.float)
X = data[:,0]
Y = data[:,1]
Z = data[:,2] * -1
C = []
#下面这循环是根据Z值(地震深度)设置颜色
for z in Z:
if z >= -60:
C.append("r")
elif z < -300:
C.append("k")
else:
C.append("y")
#好吧,关键就是这个方法,把XYZ三个值扔进去,三维散点图就出来了,打完收工。。。
ax.scatter(X,Y,Z,c=C,alpha=0.4,s=10)
ax.set_xlabel('longitude')
ax.set_ylabel('latitude')
ax.set_zlabel('deepth')
当然,上面是部分代码,需要完整源代码的,可以通过微信公众号发送2,获取虾神的邮箱,然后发一封包含自我介绍的邮件来获取所有的代码和数据。
下期预告:用R语言来做三维散点图(如果虾神的懒癌不发作的话)。