矩阵与向量往往用来解决高纬度的问题。但是,人类属于三维生物, 我们没有办法将3D以上的问题用直观的几何来体现出来, 为了研究向量在高纬度上的几何意义,我们需要学会绘制2D,3D图像,再从低维推至高维。
老规矩,先上演示图,再上代码,最后解析。
![undefined undefined](post/images/1594615777274140.png)
from mpl_toolkits.mplot3d import Axes3D # noqa: F401 unused import
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
#创建3D坐标系
ax = fig.gca(projection='3d')
#画起点为(0,0,0),终点为(1,1,1)的向量
ax.quiver(0,0,0,1,1,1,arrow_length_ratio=0.3)
#画起点为(0,0,0),终点为(3,3,3)的向量
ax.quiver(0,0,0,3,3,3,arrow_length_ratio=0.1)
ax.set_xlim(0,4)
ax.set_ylim(0,4)
ax.set_zlim(0,4)
plt.show()
首先,我们需要画一个3D坐标系,怎么画呢?去官方找文档
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.gca(projection='3d')
但是,大部分同学会发现程序报错,
ValueError: Unknown projection '3d'
看到这个报错,我第一想法是版本问题,于是查看我当前matplotlib版本号,发现是3.1.3:
input:
import matplotlib
matplotlib.__version__
output:
'3.1.3'
再看官方文档的版本号,是3.2.2,与我在使用的版本相差0.1代:
![undefined undefined](post/images/1594607594700556.png)
![undefined undefined](post/images/1594607886822322.png)
# This import registers the 3D projection, but is otherwise unused.
from mpl_toolkits.mplot3d import Axes3D # noqa: F401 unused import
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.gca(projection='3d')
plt.show()
![undefined undefined](post/images/1594606944227303.png)
或许有的同学会问,为啥要这么折腾呢,直接百度,一个程序不行就找第二个程序,总会有一个可以用的。 这说的没错,但是,我们应当培养通过看文档与源码来解决问题的能力,世界最优秀的文档与代码放在那免费给我们学习,我们有什么理由不学呢? 而且,百度能解决的问题往往比较局限。
接着是如何绘制向量,在《使用matplotlib的quiver绘制向量》中 ,我们使用了quiver(),但是它貌似只能用来绘制2D,于是,我试着在文档主页搜索quiver,探究有没绘制3D向量的方式
![undefined undefined](post/images/1594610930206771.png)
quiver(X, Y, Z, U, V, W, /, length=1, arrow_length_ratio=0.3, pivot='tail', normalize=False, **kwargs) Plot a 3D field of arrows.翻译:用于绘制3D向量场
显然,同样是quiver(),但在2D坐标系与3D坐标系中其实是不同的函数,类似的,plot,bar等函数也是一个道理。 在绘制2D向量的时候,我们提到过,quiver函数是用来绘制向量场的, 用它来绘制简单的向量实际上是大材小用,也是一种限制,许多参数我们用不到,有的用法还得改。
length=1,这个默认参数不能动,要不然画出1个单位长度的向量会变成length个单位长度 pivot='tail'类似,不要去修改它,否则长度会变化
arrow_length_ratio,是箭头长度与向量总长度的比值,如果使用默认值会出现箭头大小不一致的问题
![undefined undefined](post/images/1594615555661188.png)
# This import registers the 3D projection, but is otherwise unused.
from mpl_toolkits.mplot3d import Axes3D # noqa: F401 unused import
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.quiver(0,0,0,1,1,1)
ax.quiver(0,0,0,3,3,3)
ax.set_xlim(0,4)
ax.set_ylim(0,4)
ax.set_zlim(0,4)
plt.show()
这时候,如果有必要的话,我们根据向量的长度改一下arrow_length_ratio,即可让向量变得更漂亮
![undefined undefined](post/images/1594615777274140.png)
ax.quiver(0,0,0,1,1,1,arrow_length_ratio=0.3)
ax.quiver(0,0,0,3,3,3,arrow_length_ratio=0.1)