在学习数学时,经常希望绘制2/3D的函数图像/图像帮助理解
以下是实现方法:
2D图像:
from matplotlib import pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import axes3d
low=lambda x:10000 if x>10000 else -10000 if x<-10000 else x
f=lambda x:x**5#设计一个函数
start=-10 #输入需要绘制的起始值(从左到右)
stop=10 #输入需要绘制的终点值
step=0.01#输入步长
num=(stop-start)/step #计算点的个数
x = np.linspace(start,stop,num)
y = f(x)
for i in range(len(y)):#再应用一个low函数以防止函数值过大导致显示错误(可选)#若函数无法直接应用到np数组上可以使用for来逐个应用
y[i]=low(y[i])
z=y
fig=plt.figure(figsize=(6,6))#建立一个对象并设置窗体的大小,使其为正方形,好看 #注意 可以建立多个对象,但plt指令只会对最后一个指定的对象进行操作(查看过源码了)
plt.plot(x, y,label='First Curve')#在当前的对象上进行操作
plt.grid(True)#显示网格
plt.axis("equal")#设置了x、y刻度长度一致#需要放在x、ylim指令前
plt.xlim((-10, 10))#显示的x的范围(不设置则由程序自动设置)
plt.ylim((-10, 10))#显示的y的范围
plt.plot([2*min(x),2*max(x)], [0,0],label='x-axis')#用定义域最长距离的两倍作出x轴
plt.plot([0,0],[2*min(y),2*max(y)],label='y-axis')#用值域最长距离的两倍作出y轴
plt.legend()#显示旁注#注意:不会显示后来再定义的旁注
plt.show(fig)#没有输入值默认展示所有对象 #注意:plt.show()之后再次使用plt.show()指令将不会展示任何对象,若想再次展示对象,可以对对象使用fig.show()
效果如图
3D图像
一、3D曲线
import numpy as np #载入numpy
import matplotlib.pyplot as plt #载入matplotlib.pyplot
from mpl_toolkits.mplot3d import Axes3D #载入Axes3D用以实现3D作图
fig=plt.figure(figsize=(6,6)) #创建一个对象(正方形窗体)#注意由于3D作图是设置'equal'没什么效果,且3D作图的缩放是等比例缩放所以只需要设定窗体为正方形并且不去变动窗体形状就可以保证x、y、z刻度长度一致
ax=Axes3D(fig) #设置这个对象为3D作图的
t=np.linspace(-1,1,100)#设置一个参数t
#设计一个单变量的参数方程
x=t
y=t**3
z=t
ax.plot(x,y,z,label='First Curve') #用ax进行3D作画
m=max(max(x),max(y),max(z))#求出x,y,z三个集合中的最大元素
#用xyz中的最大元素建立直角坐标系,由于此时xyz三个方向上的最大最小值大小都相同,→此时xyz三轴的刻度长度是相等的(一举两得)
ax.plot([-m,m],[0,0],[0,0],label='x-axis')
ax.plot([0,0],[-m,m],[0,0],label='y-axis')
ax.plot([0,0],[0,0],[-m,m],label='z-axis')
ax.legend()
ax.set_xlabel('x axis')#标注x、y、z轴帮助观察
ax.set_ylabel('y axis')
ax.set_zlabel('z axis')
plt.show()
值得注意的是:在上述两例中均使用的是plot函数来进行线性制图,这会将每个点按顺序连接起来,而我们也可以直接使用scatter函数(plt.scatter或ax.scatter)来进行散点制图。散点制图额外的优点是不会在函数数值极大时导致极远处的两个点被连成一条线影响美观影响判断
二、3D曲面
from matplotlib import pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = Axes3D(fig)
x = np.arange(-2, 2, 0.1) #创建等差数组 与np.linspace类似但不相同(arange使用的是步长不是步数)
y = np.arange(-2, 2, 0.1)
x, y = np.meshgrid(x, y)
#meshgrid生成两个新的矩阵,其中前一个矩阵中的每一个元素都在后一个矩阵中的相同位置有一个对应,且这个对应满足x中的每一个元素都与y中的每一个元素对应一次,这种对应的总数是x与y的元素数量之积,可以转化为一种组合。
#在建立曲面的时候,我们需要两个变量(在参数方程中意为我们需要两个参数)。当这两个变量是有限个的时候我们需要分别考虑他们的每一种组合。meshgrid便提供了实现这件事的简便方法。
z = x**2 + y**2-5 #这是一个经过平移的抛物面的方程,我们可以直接对x和y进行组合并求z来得到一个近似的抛物面图像(我们也可以把这个方程改写成参数方程并用参数的组合来得到一个近似的抛物面图像) #对矩阵**2并相加可以使对应元素各自平方并求和
ax.plot_wireframe(x, y, z,label='First Surface') #plot_wireframe可以创建网格式的平面(plot_surface可以创建平面但是程序运行较慢,适合截图不适合拖动)
m=max(abs(x).max(),abs(y).max(),abs(z).max())#求出x,y,z三个集合中的最大元素
#用xyz中的最大元素建立直角坐标系,由于此时xyz三个方向上的最大最小值大小都相同,→此时xyz三轴的刻度长度是相等的(一举两得)
ax.plot([-m,m],[0,0],[0,0],label='x-axis')
ax.plot([0,0],[-m,m],[0,0],label='y-axis')
ax.plot([0,0],[0,0],[-m,m],label='z-axis')
ax.set_xlabel('x axis')#标注x、y、z轴帮助观察
ax.set_ylabel('y axis')
ax.set_zlabel('z axis')
plt.show()
3D曲面效果如图
总结:
1.matplotlib是一个复杂的功能强大多样的库,我们可以从中各取所需,不一定要学习透彻。
2.由于函数与图像是多样的,所以在使用matplotlib辅助学习时要灵活调整其中的参数,不一定要与本文中的例子完全一样。