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

数据可视化——绘制3D图表和绘制地图,第1张


一、使用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 plot
from mpl_toolkits.mplot3d import axes3d
fig=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 plot
from mpl_toolkits.mplot3d import axes3d
from matplotlib import cm
import numpy as np
x1=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 np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
plt.rcParams["font.sans-serif"]=["SimHei"]
plt.rcParams["axes.unicode_minus"]=False
x=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 np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
x=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 line
def init():
    line.set_ydata(np.sin(x))
    return line
ani=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 np
import matplotlib.pyplot as plt
from matplotlib.animation import ArtistAnimation
x=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 np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
from matplotlib.animation import FuncAnimation
plt.rcParams["font.sans-serif"]=["SimHei"]
plt.rcParams["axes.unicode_minus"]=False
xx=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_star
def init():
    return star
ani=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 np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
plt.rcParams["font.sans-serif"]=["SimHei"]
plt.rcParams["axes.unicode_minus"]=False
map=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图片20220315184244.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))*1000
x,y=map(lon,lat)
map.scatter(x,y,s=size)
plt.title('人口分布情况  39')
plt.show()

运行结果如下:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/579177.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-11
下一篇 2022-04-11

发表评论

登录后才能评论

评论列表(0条)

保存