您的位置:首页 > 编程语言 > Python开发

三维散点图:Python 之matplotlib篇

2016-11-09 17:06 736 查看
散点图应该是我们做可视化时候接触到的第一个图形,无论是在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的内容,可以查看其官方主页:http://matplotlib.org/ 到我写这篇文章为止,最新的版本是1.5.3。

 

下面就简单说说matplotlib的三维散点图怎么做:

贴部分代码和注释,有兴趣的同学可以问我要数据和源代码

 

def s3dDemo1():

    fig = plt.figure()

    ax = fig.add_subplot(111, projection='3d')

     #下面这段话,是利用numpy包读取csv里面的数据,然后分别取出X\Y\Z三维值

    eq2013 = np.loadtxt(csvfile, dtype=np.str,delimiter=",")

    data = eq2013[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语言来做三维散点图(如果虾神的懒癌不发作的话)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: