python学习---画3d曲线曲面图
导语就是想记录并分析一下用pthon画图的经历开始画图先贴最终效果和源代码:from matplotlib import pyplot as pltimport numpy as npfrom mpl_toolkits.mplot3d import Axes3Dfigure = plt.figure()ax = Axes3D(figure)X = np.arange(-10,10,0.
导语
就是想记录并分析一下用pthon画图的经历
开始画图
先贴最终效果和源代码:
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的坐标系出来,于是乎:
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的所有点,效果如下:
接下来我们用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
灰度图是cmap=matplotlib.gray
默认的图
另外如果想要再加上x,y,z的坐标轴名称,并且加上图片的主题,只需添加
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
ax.set_title('gray figure')
即可,获得下面的图:
大概懂了吧,其实我主要是想画这样的一个图,圆心取为0点,半径为1,圆周上的高度为
1+sinθ
那么我们不难算得:
这样子的一条曲线
画出来长这个样子
源代码如下:
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来画,且不需要网格化数据
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)