1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Python绘制三维图像实例

Python绘制三维图像实例

时间:2023-01-22 15:17:15

相关推荐

Python绘制三维图像实例

欢迎前往我的个人博客阅读原文。

Python的Matplotlib库是一个比较强大的绘图库,可以比较好的代替Matlab实现绘图功能。下面我从学校开设的Matlab上机实验课程中的练习题挑出与绘图相关的练习给出Python代码,仅供参考。

Matplotlib库通常用来绘制二维曲面图形,下面我们给出了二维曲线的一个标记的例子和一个绘制子图的例子;其余的例子都是绘制三维图形,这需要将坐标轴设置为三维的坐标系,我们主要采用下列方式进行设置:

fig = plt.figure()ax = fig.subplot(111, projection='3d')

另外一种方式需要调用Matplotlib库的一个工具包,可以自行网上搜索进行学习。

可以前往我的GitHub查看源代码。

示例一 曲线的标记

绘出函数 y=3cos⁡xesin⁡xy=3\cos x e^{\sin x}y=3cosxesinx 在 [0,5][0,5][0,5] 上黑色实型曲线图,线宽为3,数据点用圆圈标记的,尺寸为6,标记点的边缘颜色为红色,标记点的填充颜色为绿色;加栅阁并且绘图区域为正方形,各坐标轴采用登场刻度。

import matplotlib.pyplot as pltimport numpy as npif __name__ == '__main__':x = np.arange(0, 5, 0.1)y = 3*np.cos(x)*np.exp(np.sin(x))fig, ax = plt.subplots()ax.plot(x, y, 'k-o', linewidth=3,markeredgecolor='r',markerfacecolor='g',markersize=10)ax.grid(True)plt.axis('equal')plt.show()

绘制的图形如下图所示:

示例二 参数方程

绘制曲线 {x=2(cos⁡t+tsin⁡t)y=2(sin⁡t−tcos⁡t)z=1.5t\begin{cases} x = 2(\cos t + t\sin t) \\ y = 2(\sin t - t\cos t) \\ z=1.5t \end{cases}⎩⎪⎨⎪⎧​x=2(cost+tsint)y=2(sint−tcost)z=1.5t​,ttt 的变化范围为 [0,10π][0, 10\pi][0,10π].

import matplotlib.pyplot as pltimport numpy as npif __name__ == '__main__':t = np.arange(0, 10*np.pi, 0.1*np.pi)x = 2*(np.cos(t) + t*np.sin(t))y = 3*(np.sin(t) - t*np.cos(t))z = 1.5*tfig = plt.figure()ax = fig.add_subplot(111, projection='3d')ax.plot3D(x, y, z)plt.show()

plot3D()是用来绘制三维曲线的,类似于plot()函数。绘制的图形如下图所示:

绘制环面图形,其参数方程为:

{x=(2+cos⁡u)cos⁡vy=(2+cos⁡u)sin⁡vz=sin⁡uu∈[0,2π],v∈[0,2π]\begin{cases} x = (2 + \cos u)\cos v \\ y = (2 + \cos u)\sin v \\ z = \sin u \end{cases} \quad\quad\quad u\in[0,2\pi],v\in[0,2\pi] ⎩⎪⎨⎪⎧​x=(2+cosu)cosvy=(2+cosu)sinvz=sinu​u∈[0,2π],v∈[0,2π]

import matplotlib.pyplot as pltimport numpy as npif __name__ == '__main__':fig = plt.figure()ax = fig.add_subplot(111, projection='3d')u, v = np.mgrid[0:2*np.pi:40j, 0:2*np.pi:40j]x = (2 + np.cos(u))*np.cos(v)y = (2 + np.cos(u))*np.sin(v)z = np.sin(u)ax.plot_surface(x, y, z, rstride=1, cstride=1)plt.show()

plot_surface()和Matlab中的surf()比较相似,是用来绘制三维曲面的,后面的rstridecstride这两个参数分别表示行之间的跨度和列之间的跨度;和这两个不能同时出现的是rcountccount,分别表示行的间隔个数和列的间隔个数;另外还有cmap参数,可以设置颜色。绘制的图形图下图所示:

示例三 子图的绘制

在 [0,30][0,30][0,30] 内分别绘出下列函数的图像(采样点均为100个):y=sin⁡xy=\sin xy=sinx,y=xsin⁡x,y=x\sin x,y=xsinx,y=xsin⁡2xy=x\sin^2 xy=xsin2x,y=x2sin⁡2xy=x^2 \sin^2 xy=x2sin2x,使得四个图像分别按左上,左下,右上,右下的顺序在同一窗口中排列,并对每一个图形分别加以标注,指明该曲线所表示的函数。

import matplotlib.pyplot as pltimport numpy as npif __name__ == '__main__':x = np.linspace(0, 30, 100)fig = plt.figure()ax1 = fig.add_subplot(221)ax1.plot(x, np.sin(x))ax1.set_title(r'$\sin(x)$')ax2 = fig.add_subplot(222)ax2.plot(x, x*np.sin(x)*np.sin(x))ax2.set_title(r'$x\sin^2(x)$')ax3 = fig.add_subplot(223)ax3.plot(x, x*np.sin(x))ax3.set_title(r'$x\sin(x)$')ax4 = fig.add_subplot(224)ax4.plot(x, x*x*np.sin(x)*np.sin(x))ax4.set_title(r'$x^2\sin^2(x)$')plt.show()

在设定标签时如果要支持LaTeX语法,需要使用r'$$'字符串,其中公式在$$中间,这一点和Matlab不同。绘制的图形如下图所示:

示例四 曲面的绘制

画出下列方程式的曲面图

f(x,y)=0.2cos⁡x+yexp⁡(−x2−y2)f(x,y) = 0.2\cos x + y\exp(-x^2 - y^2) f(x,y)=0.2cosx+yexp(−x2−y2)

其中,xxx 的21个值均匀分布在 [−2π,2π][-2\pi, 2\pi][−2π,2π] 范围,yyy 的31个值均匀分布在 [−π,π][-\pi, \pi][−π,π]。并对点 (0,0,f(0,0))(0,0,f(0,0))(0,0,f(0,0)) 用箭头进行标注。

import matplotlib.pyplot as pltimport numpy as npif __name__ == '__main__':x = np.linspace(-2*np.pi, 2*np.pi, 21)y = np.linspace(-np.pi, np.pi, 31)X, Y = np.meshgrid(x, y)f = lambda x, y: 0.2*np.cos(x) + y*np.exp(-x*x - y*y)Z = f(X, Y)fig = plt.figure()ax = fig.add_subplot(111, projection='3d')ax.plot_wireframe(X, Y, Z, rstride=1, cstride=1)ax.text(0, 0, f(0, 0), r'$\leftarrow(0,0,' + str(f(0, 0)) + ')',zdir=(-1, -1, 0))plt.show()

这里使用箭头标记不能使用annotate()函数,因为这个函数中xy坐标只能是二维坐标。使用text()进行标记和Matlab中的差不多,箭头使用的LaTeX语法,另外zdir参数是标记文字的方向。绘制好的图形如下图所示:

绘制 z=x14+3x12+x22−2x1−2x2−2x12x2+6z = x_1^4 + 3x_1^2 + x_2^2 -2x_1 - 2x_2 -2x_1^2x_2 +6z=x14​+3x12​+x22​−2x1​−2x2​−2x12​x2​+6 的三维图形,其中 x1∈[−3,3]x_1\in[-3,3]x1​∈[−3,3],x2∈[−3,13]x_2\in[-3,13]x2​∈[−3,13]。

import numpy as npimport matplotlib.pyplot as pltif __name__ == '__main__':x1 = np.arange(-3, 3, 0.1)x2 = np.arange(-3, 13, 0.5)X, Y = np.meshgrid(x1, x2)Z = X**4 + 2X**2 + Y**2 - 2*X - 2*Y - 2*X**2*Y + 6fig = plt.figure()ax = fig.add_subplot(111, projection='3d')ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow')

绘制的图形如下图所示:

示例五 多个图形的绘制

在同一个图形窗口内绘制:窗口半径为2的球面,z=4z=4z=4 的平面及墨西哥帽子函数:z=sin⁡x2+y2x2+y2z = \dfrac{\sin\sqrt{x^2 + y^2}}{\sqrt{x^2 + y^2}}z=x2+y2​sinx2+y2​​.

import matplotlib.pyplot as pltimport numpy as npif __name__ == '__main__':fig = plt.figure()ax = fig.add_subplot(111, projection='3d')# 绘制窗口半径为2的球面phi, theta = np.mgrid[0:2*np.pi:40j, 0:np.pi:20j]x = 2*np.sin(phi)*np.cos(theta)y = 2*np.sin(phi)*np.sin(theta)z = 2*np.cos(phi)ax.plot_surface(x, y, z, rstride=1, cstride=1, cmap='rainbow')# 绘制z=4的平面x = np.arange(-2, 2, 0.2)y = np.arange(-2, 2, 0.2)X, Y = np.meshgrid(x, y)ax.plot_surface(X, Y, 4*np.one_like(X),rstride=1, cstride=1, cmap='rainbow')# 绘制墨西哥帽子函数x = np.arange(-4.1, 4.1, 0.2)y = np.arange(-4.1, 4.1, 0.2)X, Y = np.meshgrid(x, y)Z = np.sin((X**2 + Y**2)**0.5)/(X**2 + Y**2)**0.5ax.plot_surface(X, Y, Z, rstride=1, cstride=1)plt.show()

球面、柱面这些三维图形不像Matlab中有直接的函数进行绘制,比较好的方法就是通过参数方程来解决。另外,mgrid()函数中的j表示个数,这里不需要使用hold来保持不动,可以直接绘制多个图形。值得注意的是,在绘制墨西哥帽子函数时,参数的取值不能有0,否则会出现无穷大的情况报错。绘制好的图形如下图所示:

示例六 旋转抛物面

绘制一个旋转抛物面 z=x2+y260z = \dfrac{x^2 + y^2}{60}z=60x2+y2​.

import numpy as npimport matplotlib.pyplot as pltif __name__ == '__main__':fig = plt.figure()ax = fig.add_subplot(111, projection='3d')rho, theta = np.mgrid[0:np.sqrt(60):60j, 0:2*np.pi:40j]x = rho*np.cos(theta)y = rho*np.sin(theta)z = rho**2/60ax.plot_surface(x, y, z, rstride=1, cstride=1)plt.show()

绘制的图形如下图所示:

示例七 圆柱面

绘制圆柱面 x2+y2=xx^2 + y^2 = xx2+y2=x.

import matplotlib.pyplot as pltimport numpy as npif __name__ == '__main__':fig = plt.figure()ax = fig.add_subplot(111, projection='3d')h = np.linspace(0, 1, 20)theta = np.linspace(0, 2*np.pi, 40)x = np.outer(np.sin(theta), np.ones(len(h)))y = np.outer(np.cos(theta), np.ones(len(h)))z = np.outer(np.ones(len(theta)), h)ax.plot_surface(x+0.5, y, z, rstride=1, cstride=1)plt.show()

绘制圆柱的时候各坐标均是由向量的外积进行计算的,毕竟竖坐标不受横纵坐标的影响。绘制好的图形如下图所示:

绘制圆柱面 x2+y2=1x^2 + y^2 = 1x2+y2=1 的图像,高度范围在 [−2,2][-2, 2][−2,2].

import matplotlib.pyplot as pltimport numpy as npif __name__ == '__main__':fig = plt.figure()ax = fig.add_subplot(111, projection='3d')h = np.linspace(-2, 2, 80)theta = np.linspace(0, 2*np.pi, 40)x = np.outer(np.sin(theta), np.ones(len(h)))y = np.outer(np.cos(theta), np.ones(len(h)))z = np.outer(np.ones(len(theta)), h)ax = plot_surface(x, y, z, rstride=1, cstride=1)plt.show()

绘制好的图形如下图所示:

示例八 圆锥面

绘制圆锥面 {x=usin⁡vy=ucos⁡vz=u\begin{cases} x = u\sin v \\ y = u\cos v \\ z = u \end{cases}⎩⎪⎨⎪⎧​x=usinvy=ucosvz=u​,参数 uuu 的范围是 [−2,2][-2, 2][−2,2],vvv 的范围是 [0,2π][0, 2\pi][0,2π].

import matplotlib.pyplot as pltimport numpy as npif __name__ == '__main__':fig = plt.figure()ax = fig.add_subplot(111, projection='3d')u, v = np.mgrid[-2:2:80j, 0:2*np.pi:40j]x = u*np.sin(v)y = u*np.cos(v)z = uax.plot_surface(x, y, z, rstrid=1, cstride=1)plt.show()

绘制好的图形如下图所示:

Matplotlib库有很多其他的应用,这里面所说的内容还不完全,有待补充。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。