三个案例,彻底学会Python三维绘图 | 您所在的位置:网站首页 › 怎么画立体的我的世界人物图片 › 三个案例,彻底学会Python三维绘图 |
文章目录
散点图三维图画一个地球
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 实验室设备网 版权所有 |