|
文章目录散点图三维图画一个地球matplotlib教程:初步📈子图绘制📈坐标投影📈刻度设置📈共享坐标轴📈内容填充📈文字和字体📈伪彩图和等高线图散点图【plt】通过坐标映射的方式来实现对三维绘图的支持,这一点在讲解坐标投影时已经提到过了,故而可以在三维空间中绘制曲线。事实上,如果不考虑表现力的话,几乎所有可以在二维空间中绘制的图像,都可以映射到三维空间中,而其中表现力最强的则属散点图。和曲线图相比,散点图中的每个点都是独立的,而足够数量的独立的点原则上可以构造出任何图形,不仅可以连成曲线,也可以用于表现曲面。上面两个图像完全相同,但其绘制代码稍有差别,其左图的X,Y,ZX,Y,ZX,Y,Z坐标均为矩阵,而右图均为向量,换言之,散点图在绘制过程中,仅要求三个轴的坐标一一对应,但对其具体形式并无要求。importmatplotlib.pyplotaspltfrommatplotlibimportcmimportnumpyasnpX,Y=np.indices([30,30])/3-5Z=np.sin(np.sqrt(X**2+Y**2))ax=plt.subplot(121,projection='3d')ax.scatter(X,Y,Z,c=Z)ax=plt.subplot(122,projection='3d')ax.scatter(X.reshape(-1),Y.reshape(-1),Z.reshape(-1),c=Z)plt.show()1234567891011121314三维图和相对通用的散点图比,【plt】提供了三个专用的三维绘图函数,分别是曲面图plot_surface;网格图plot_wireframe以及三角面图plot_trisurf,三者差别如下其中,网格图相对来说易于辨认,毕竟只有它没有上色。而曲面图和三角面图在外观上几乎没有差别,二者的差别主要体现在绘图逻辑上,这种差异可以从绘图代码中得窥一二。fig=plt.figure(figsize=(12,5))ax=fig.add_subplot(131,projection='3d')ax.plot_surface(X,Y,Z)plt.title("plot_surface")ax=fig.add_subplot(132,projection='3d')ax.plot_wireframe(X,Y,Z)plt.title("plot_wireframe")ax=fig.add_subplot(133,projection='3d')ax.plot_trisurf(X.reshape(-1),Y.reshape(-1),Z.reshape(-1))plt.title("plot_trisurf")plt.tight_layout()plt.show()12345678910111213141516在上述代码中,plot_surface和plot_wireframe相对来说比较统一,其输入均为矩阵,或者更加清晰一点,其输入的X,YX,YX,Y即为坐标格点。在绘图时,根据做表格点所对应的高程ZZZ来实现绘图。从plot_wireframe的网格可以看出,其网格形状为四边形。plot_trisurf的功能则是三角面绘制,换言之,其绘图时会生成三角形的网格,然后再将每个三角面涂上颜色。画一个地球有了三维绘图函数,就可以画一个球了,而且不止可以画一个球,甚至能画一个地球,像下面这样其绘制思路是,找一张地图,将其RGB映射到球面上,而球面的参数方程为x=rcosϕcosθy=rcosϕsinθz=rsinϕx=rcosϕcosθy=rcosϕsinθz=rsinϕxyz=rcosϕcosθ=rcosϕsinθ=rsinϕ绘图代码如下path="earth1.jpg"img=plt.imread(path)h,w,c=img.shapeys,xs=np.indices([h,w])th=xs/w*np.pi*2phi=np.pi/2-ys/h*np.pix=np.cos(phi)*np.cos(th)y=np.cos(phi)*np.sin(th)z=np.sin(phi)cs=[tuple(c/255)forcinimg.reshape(-1,3)]ax=plt.subplot(projection='3d')ax.scatter(x,y,z,marker='.',c=cs)plt.axis('off')plt.show()12345678910111213141516
|
|