欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python学习---画3d曲线曲面图

程序员文章站 2022-07-13 09:13:35
...

导语

就是想记录并分析一下用pthon画图的经历

开始画图

先贴最终效果和源代码:
python学习---画3d曲线曲面图

from matplotlib import pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
figure = plt.figure()
ax = Axes3D(figure)
X = np.arange(-10,10,0.25)
Y = np.arange(-10,10,0.25)
X,Y = np.meshgrid(X,Y)
R = np.sqrt(X**2 + Y**2)
Z = np.cos(R)
ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap='rainbow')
plt.show()

好看吧,我们现在一句句来看这个是怎么实现的,导入库啥的我就不说了,这个图主要是用matplotlib和mpl_toolkits.mplot3d这两个库结合画出来的

figure = plt.figure()
ax = Axes3D(figure)

执行figure是定义了一个可以进行操作的空间,执行之后会弹出一个窗口,但是因为你啥也没输入,所以目前这个窗口里的内容是一片空白~
但是当我们输入ax这条语句之后,我们相当告诉电脑我们准备画的是一个3D的图,所以你快生成一个3D的坐标系出来,于是乎:
python学习---画3d曲线曲面图

X = np.arange(-10,10,0.25)
Y = np.arange(-10,10,0.25)
X,Y = np.meshgrid(X,Y)
R = np.sqrt(X**2 + Y**2)
Z = np.cos(R)

这一段代码都是在生成(x,y,z)的点,我们要画什么样的图完全有这段代码所决定,讲解一下其中的np.meshgrid()方法吧,大家想一想我们现在是在这个平面上取了大概6400个点((200.25)2),但是我们现在所生成的X和Y却远远不够6400,但是我们如果使用该语句,即可遍历X和Y的所有点,效果如下:
python学习---画3d曲线曲面图
接下来我们用R = np.sqrt(X**2 + Y**2),这其实同样使得R生成了6400个点,这同时也是在网格化数据

ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap='rainbow')
plt.show()

这是将该X,Y,R画出来的代码,因为X,Y,R都是6400个,所以改代码只需将X,Y,R在array中的位置对应起来即可而不必重新遍历。
并且表示plot_surface这个方法中的参数,rstride和cstride这两个参数我也不是很懂,尝试修改了一下貌似如果这个值选的越大就越粗糙吗?我也不是很清楚

然后cmap=’rainbow’就是按照彩虹颜色变化的深浅里画图,类似的参数还有冷暖色调
cmap=matplotlib.coolwarm
python学习---画3d曲线曲面图

灰度图是cmap=matplotlib.gray
python学习---画3d曲线曲面图
默认的图
python学习---画3d曲线曲面图

另外如果想要再加上x,y,z的坐标轴名称,并且加上图片的主题,只需添加

ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
ax.set_title('gray figure')

即可,获得下面的图:
python学习---画3d曲线曲面图


大概懂了吧,其实我主要是想画这样的一个图,圆心取为0点,半径为1,圆周上的高度为1+sinθ
那么我们不难算得:

x=cosθy=sinθz=1+3sinθ

这样子的一条曲线
python学习---画3d曲线曲面图
画出来长这个样子
源代码如下:

from matplotlib import pyplot as plt
import numpy as np
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D

figure = plt.figure()
ax = Axes3D(figure)
t = np.arange(0,2*np.pi,0.05)
x = np.cos(t)
y = np.sin(t)
z = 3+np.sin(3*t)
ax.plot_wireframe(x,y,z)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('f')
ax.set_title('f')
plt.show()

这里是换成了用plot_wireframe来画,且不需要网格化数据