导语

就是想记录并分析一下用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θ
那么我们不难算得:

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

这样子的一条曲线
这里写图片描述
画出来长这个样子
源代码如下:

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来画,且不需要网格化数据

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐