一、使用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()
运行结果如下:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)