用matplotlib在三维空间绘制向量

讨论 我不是赌鬼
Lv5 宗师级炼丹师
发布在 Matplotlib   6989   1
讨论 我不是赌鬼   6989   1

    矩阵与向量往往用来解决高纬度的问题。但是,人类属于三维生物, 我们没有办法将3D以上的问题用直观的几何来体现出来, 为了研究向量在高纬度上的几何意义,我们需要学会绘制2D,3D图像,再从低维推至高维。

    老规矩,先上演示图,再上代码,最后解析。

    undefined

    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
    我看了文档的其他地方,发现没有3.1版本的入口,于是进入github,找到它的3.1.X分支,并打开3DPlot例程
    undefined
    在该例程中,3D坐标系的绘图方式多了一个import,程序运行正常。显然,在3.2中3D图库被合并到了pyplot中。

    # 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

    或许有的同学会问,为啥要这么折腾呢,直接百度,一个程序不行就找第二个程序,总会有一个可以用的。 这说的没错,但是,我们应当培养通过看文档与源码来解决问题的能力,世界最优秀的文档与代码放在那免费给我们学习,我们有什么理由不学呢? 而且,百度能解决的问题往往比较局限。

    接着是如何绘制向量,在《使用matplotlib的quiver绘制向量》中 ,我们使用了quiver(),但是它貌似只能用来绘制2D,于是,我试着在文档主页搜索quiver,探究有没绘制3D向量的方式

    undefined
    进入mpl_toolkits.mplot3d.axes3d.Axes3D.quiver 可以看到该函数的简介

    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

    # 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

    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)
    
    版权声明:作者保留权利,不代表意本站立场。如需转载请联系本站以及作者。

    参与讨论

    回复《 用matplotlib在三维空间绘制向量

    EditorJs 编辑器

    沙发,很寂寞~
    反馈
    to-top--btn