1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 数据可视化——绘制3D图表和绘制地图

数据可视化——绘制3D图表和绘制地图

时间:2021-09-12 03:57:26

相关推荐

数据可视化——绘制3D图表和绘制地图

一、使用mplot3d绘制3D图表

1.1、mplot3d概述

matplotlib不仅专注于二维图表的绘制,也具有绘制3D图表、统计地图的功能,并将这些功能分别封装到工具包mpl_toolkits.mplot3d。mpl_toolkits.basemap中,另外还可以结合animation模块给图表添加动画效果。

matplt otlib 可以两种方式可以创建Axes3D类的对象。

通过以下:

第一种: Axes3D()方法。

第二种: add_subplot()方法。

1.2、绘制常见的3D图表

常见的3D图表包括3D线框图、3D曲面图、3D柱形图、3D散点图等。

Axes3D类的常见绘图方法及其说明

1、绘制3D线框图

Axes3D类的对象使用plot_wireframe()方法绘制线框图,语法格式如下.

plot_wireframe(self,X,Y,Z,*args,**kwargs

该方法的常用语法是:

X,Y,Z:表示x、y、z轴的数据。rcount,ccount:表示每个轴方向上使用的最大样本量,默认为50。若输入的样本量更大,则会采用降采样的方式减少样本的数量;若输入的样本量为0,则不会对相应轴方向的数据进行采样。rstride,cstride:表示采样的密度。若仅使用参数rstride或cstride中任意一个,则另一个参数默认为0。

绘制3D线框图的示例代码如下:

import matplotlib.pyplot as plotfrom mpl_toolkits.mplot3d import axes3dfig=plt.figure()ax=fig.add_subplot(111,projection='3d')X,Y,Z=axes3d.get_test_data(0.05)ax.plot_wireframe(X,Y,Z,rstride=10,cstride=10)plt.title('39')plt.show()

代码运行结果如下:

2、绘制3D曲面图

Axes3D类的对象使用plot_surface()方法绘制3D曲面图,语法格式如下:

plot_surface(self, X,Y,Z,*args, norm=None.vmin=None. vmax=None语法lightsource=None,**kwargs)

该方法常用的参数含义如下:

X,Y,Z:表示x、y、z轴的数据。rcount,ccount:表示每个坐标轴方向上使用的最大样本量,默认为50。rstride,cstride:表示采样的密度。color:表示曲面的颜色。cmap:表示曲面的颜色映射表。shade:表示是否对曲面进行着色。

绘制3D曲面图的示例代码如下:

import matplotlib.pyplot as plotfrom mpl_toolkits.mplot3d import axes3dfrom matplotlib import cmimport numpy as npx1=np.arange(-5,5,0.25)y1=np.arange(-5,5,0.25)x1,y1=np.meshgrid(x1,y1)r1=np.sqrt(x1**2+y1**2)z1=np.sin(r1)fig=plt.figure()ax=fig.add_subplot(111,projection='3d')ax.plot_surface(x1,y1,z1,cmap=cm.coolwarm,linewidth=0,antialiased=False)ax.set_zlim(-1.01,1.01)plt.title('39')plt.show()

代码运行结果如下:

实例,三维空间的星星

代码如下:

import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import axes3dplt.rcParams["font.sans-serif"]=["SimHei"]plt.rcParams["axes.unicode_minus"]=Falsex=np.random.randint(0,40,30)y=np.random.randint(0,40,30)z=np.random.randint(0,40,30)fig=plt.figure()ax=fig.add_subplot(111,projection='3d')for xx,yy,zz in zip(x,y,z):color='y'if 10<zz<20:color='#C71585'elif zz>=20:color='#008B8B'ax.scatter(xx,yy,zz,c=color,marker='*',s=160,linewidth=1,edgecolor='y')ax.set_xlabel('x轴 39')ax.set_ylabel('y轴 39')ax.set_zlabel('z轴 39') ax.set_title('3D散点图 39',fontproperties='simhei',fontsize=14)plt.tight_layout()plt.show()

代码运行结果如下:

二、使用 animation制作动图

与静态图表相比,添加了动画效果的动态图表更加生动形象,更能激发用户继续探索数据的热情。

2.1、animation概述

1.FuncAnimation类

FuncAnimation是基于函数的动画类,它通过重复地调用同一函数来制作动画,该构造方法的语法格式如下:

FuncAnimation(fig, func, frames=None. init func=None. fargs=Non,save_count=None,*, cache_frame_data=True,**kwargs)

该方法的语法格式如下:

fig:表示动画所在的画布。func:表示每帧动画调用的函数。frames:表示动画的长度(一次动画包含的帧数)。init_func:表示用于开始绘制帧的函数,它会在第一帧动画之前调用次。interval:表示更新动画的频率,以毫秒为单位,默认为200。blit:表示是否更新新的所有的点,默认为False。

例如,代码如下:

import numpy as npimport matplotlib.pyplot as pltfrom matplotlib.animation import FuncAnimationx=np.arange(0,2*np.pi,0.01)fig,ax=plt.subplots()line,=ax.plot(x,np.sin(x))def animate(i):line.set_ydata(np.sin(x+i/10.0))return linedef init():line.set_ydata(np.sin(x))return lineani=FuncAnimation(fig=fig,func=animate,frames=100,init_func=init,interval=20,blit=False)plt.title('39')plt.show()

运行结果如下:

这结果为一个动图需要加上%matplotlib qt5 才会显示其动图模式,下列图都是如此,下面就不在说明

2、ArtistAnimation类

ArtistAnimation是基于一组Artist对象的动画类,它通过一帧一帧的数据制作动画,该构造方法的语法格式如下:

ArtistAnimation(fig, artists, interval, repeat_delay, repeat,blit, *args,**kwargs)

该方法常用参数如下:

fig:表示动画所在的画布。artists:表示一组Artist 对象的列表。interval:表示更新动画的频率,以毫秒为单位,默认为200。repeat_delay:表示再次播放动画之前延迟的时长。repeat:表示是否重复播放动画。repeat:表示是否重复播放动画。

移动的正弦曲线

import numpy as npimport matplotlib.pyplot as pltfrom matplotlib.animation import ArtistAnimationx=np.arange(0,2*np.pi,0.01)fig,ax=plt.subplots()arr=[]for i in range(5):line=ax.plot(x,np.sin(x+i))arr.append(line)ani=ArtistAnimation(fig=fig,artists=arr,repeat=True)plt.title('39')plt.show()

运行结果如下:

实例:

import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import axes3dfrom matplotlib.animation import FuncAnimationplt.rcParams["font.sans-serif"]=["SimHei"]plt.rcParams["axes.unicode_minus"]=Falsexx=np.array([13,5,25,13,9,18,3,39,13,27])yy=np.array([4,38,16,26,7,19,23,25,10,15])zz=np.array([7,19,6,12,25,19,23,25,10,15])fig=plt.figure()ax=fig.add_subplot(111,projection='3d')star=ax.scatter(xx,yy,zz,c='y',marker='*',s=160)def animate(i):if i%2:color='#C71585'else:color='white'next_star=ax.scatter(xx,yy,zz,c=color,marker='*',s=160,linewidth=1,edgcolor='black')return next_stardef init():return starani=FuncAnimation(fig=fig,func=animate,frames=None,init_func=init,interval=1000,blit=False)ax.set_xlabel('x轴')ax.set_ylabel('y轴')ax.set_zlabel('z轴')ax.set_title('3D散点图 39',fontproperties='simhei',fontsize=14)plt.tight_layout()plt.show()

运行结果如下:

三、使用Iasemap绘制统计地图

3.1、 basemap概述

在数据可视化中,人们有时需将采集的数据按照其地理位置显示到地图上,常见于城市人口、飞机航线、矿藏分布等场景,有助于用户理解与空间有关的信息。basemap是matplotlib中的地图工具包,它本身不会参与任何绘图操作,而是会将给定的地理坐标转换到地图投影上,之后将数据交给matplotlib进行绘图。

1.安装basemap

接在Anaconda Prompt工具中输入如下命令︰

conda install basemap

执行以上命令后,conda命令会自动解析当前的Python环境并下载当前环境对应的basemap包。需要说明的是,在命令执行的过程中会询问用户是否安装,用户只需同意即可。

安装完成后,在命令提示符后面输入python,之后输入如下导入语句∶

from mpl_toolkits.basemap import Basemap

执行完以上语句后,若Anaconda Prompt中没有出现错误信息,则表明basemap安装成功,否则表明安装失败。

2、使用basemap

basemap工具包中主要包含一个表示基础地图背景的Basemap类,通过创建Basemap类的对象可以指定地图投影的类型和要处理的地球区域,语法格式如下:

Basemap(1lcrnrlon=None, l1crnrlat=None, urcrnrlon=None, urcrnrlat=None,l1crnrx=None, ......)

实例:

import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom mpl_toolkits.basemap import Basemapplt.rcParams["font.sans-serif"]=["SimHei"]plt.rcParams["axes.unicode_minus"]=Falsemap=Basemap(projection='stere',lat_0=90,lon_0=-105,llcrnrlat=23.41,urcrnrlat=45.44,llcrnrlon=-118.67,urcrnrlon=-64.52,rsphere=6371200.,resolution='1',area_thresh=10000)map.drawmapboundary()map.drawstates()map.drawcoastlines()map.drawcountries()parallels=np.arange(0.,90,10.)map.drawparallels(parallels,label=[1,0,0,0],fontsize=10)meridians=np.arange(-110.,-60.,10.)map.drawmeridians(meridians,label=[0,0,0,1],fontsize=10)posi=pd.read_jpg(r"C:\Users\仅存\Desktop\QQ图片0315184244.jpg")lat=np.array(posi["lat"][0:500])lon=np.array(posi["lon"][0:500])pop=np.array(posi["pop"][0:500],dtype=float)size=(pop/np.max(pop))*1000x,y=map(lon,lat)map.scatter(x,y,s=size)plt.title('人口分布情况 39')plt.show()

运行结果如下:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。