就是想记录并分析一下用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
另外如果想要再加上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来画,且不需要网格化数据