三个案例,彻底学会Python三维绘图 您所在的位置:网站首页 怎么画立体的我的世界人物图片 三个案例,彻底学会Python三维绘图

三个案例,彻底学会Python三维绘图

2024-07-13 18:16| 来源: 网络整理| 查看: 265

文章目录 散点图三维图画一个地球

matplotlib教程:初步📈子图绘制📈坐标投影📈刻度设置📈共享坐标轴📈内容填充📈文字和字体📈伪彩图和等高线图

散点图

【plt】通过坐标映射的方式来实现对三维绘图的支持,这一点在讲解坐标投影时已经提到过了,故而可以在三维空间中绘制曲线。事实上,如果不考虑表现力的话,几乎所有可以在二维空间中绘制的图像,都可以映射到三维空间中,而其中表现力最强的则属散点图。

和曲线图相比,散点图中的每个点都是独立的,而足够数量的独立的点原则上可以构造出任何图形,不仅可以连成曲线,也可以用于表现曲面。

在这里插入图片描述

上面两个图像完全相同,但其绘制代码稍有差别,其左图的 X , Y , Z X,Y,Z X,Y,Z坐标均为矩阵,而右图均为向量,换言之,散点图在绘制过程中,仅要求三个轴的坐标一一对应,但对其具体形式并无要求。

import matplotlib.pyplot as plt from matplotlib import cm import numpy as np X, Y = np.indices([30, 30])/3 - 5 Z = 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() 三维图

和相对通用的散点图比,【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()

在上述代码中,plot_surface和plot_wireframe相对来说比较统一,其输入均为矩阵,或者更加清晰一点,其输入的 X , Y X,Y X,Y即为坐标格点。在绘图时,根据做表格点所对应的高程 Z Z Z来实现绘图。从plot_wireframe的网格可以看出,其网格形状为四边形。

plot_trisurf的功能则是三角面绘制,换言之,其绘图时会生成三角形的网格,然后再将每个三角面涂上颜色。

画一个地球

有了三维绘图函数,就可以画一个球了,而且不止可以画一个球,甚至能画一个地球,像下面这样

在这里插入图片描述

其绘制思路是,找一张地图,将其RGB映射到球面上,而球面的参数方程为

x = r cos ⁡ ϕ cos ⁡ θ y = r cos ⁡ ϕ sin ⁡ θ z = r sin ⁡ ϕ \begin{aligned} x &= r\cos\phi\cos\theta\\ y &= r\cos\phi\sin\theta\\ z &= r\sin\phi \end{aligned} xyz​=rcosϕcosθ=rcosϕsinθ=rsinϕ​

绘图代码如下

path = "earth1.jpg" img = plt.imread(path) h, w, c = img.shape ys, xs = np.indices([h, w]) th = xs/w*np.pi*2 phi = np.pi/2 - ys/h*np.pi x = np.cos(phi)*np.cos(th) y = np.cos(phi)*np.sin(th) z = np.sin(phi) cs = [tuple(c/255) for c in img.reshape(-1,3)] ax = plt.subplot(projection='3d') ax.scatter(x, y, z, marker='.', c=cs) plt.axis('off') plt.show()


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有