【问题标题】:how to scale 3d Quiver diagrams correctly in Python matplotlib?如何在 Python matplotlib 中正确缩放 3d Quiver 图?
【发布时间】:2016-05-07 04:36:47
【问题描述】:

当在 3d 中使用 quiver 时,如 this example 只能设置所有箭头的长度。 它不反映所提供箭头的实际长度。

在二维情况下有效的参数比例在这里似乎不起作用。

有没有办法缩放箭头,使其长度反映给定向量场的长度?

【问题讨论】:

    标签: python matplotlib 3d


    【解决方案1】:

    这很奇怪。似乎 u,v,w 只是确定方向,而长度参数对所有长度的影响都相同。您不能将数组放入长度参数中。

    作为一种典型的解决方法,您可以单独绘制每个箭头:

    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib
    import numpy as np
    import pylab as plt
    
    print(matplotlib.__version__)
    
    fig = plt.figure()
    ax = fig.gca(projection='3d')
    
    x, y, z = np.meshgrid(np.arange(-1, 1, 0.4),
                          np.arange(-1, 1, 0.4),
                          np.arange(-1, 1, 0.4))
    x = x.reshape(np.product(x.shape))
    y = y.reshape(np.product(y.shape))
    z = z.reshape(np.product(z.shape))
    
    scale = 0.02
    u = np.sin(np.pi * x) * np.cos(np.pi * y) * np.cos(np.pi * z)
    v = -np.cos(np.pi * x) * np.sin(np.pi * y) * np.cos(np.pi * z)
    w = np.sqrt(2.0 / 3.0) * np.cos(np.pi * x) * np.cos(np.pi * y) * np.sin(np.pi * z)
    lengths = np.sqrt(x**2+y**2+z**2)
    
    for x1,y1,z1,u1,v1,w1,l in zip(x,y,z,u,v,w,lengths):
        ax.quiver(x1, y1, z1, u1, v1, w1, pivot = 'middle', length=l*0.5)
    
    ax.scatter(x,y,z, color = 'black')
    plt.show()
    

    【讨论】:

    • 单独设置每个长度确实是一种解决方法,但它似乎工作......感谢您的回答!
    【解决方案2】:

    刚刚浏览了文档http://matplotlib.org/mpl_toolkits/mplot3d/api.html 这对你有用吗?

    仍然不明显箭头长度是否正确,但至少现在看起来是 3D

    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib
    import numpy as np
    
    print(matplotlib.__version__)
    
    fig = plt.figure()
    ax = fig.gca(projection='3d')
    
    x, y, z = np.meshgrid(np.arange(-1, 1, 0.4),
                          np.arange(-1, 1, 0.4),
                          np.arange(-1, 1, 0.4))
    scale = 0.02
    u = np.sin(np.pi * x) * np.cos(np.pi * y) * np.cos(np.pi * z)
    v = -np.cos(np.pi * x) * np.sin(np.pi * y) * np.cos(np.pi * z)
    w = np.sqrt(2.0 / 3.0) * np.cos(np.pi * x) * np.cos(np.pi * y) * np.sin(np.pi * z)
    
    ax.quiver(x, y, z, u, v, w, pivot = 'middle', arrow_length_ratio = 0.02)
    ax.scatter(x,y,z, color = 'black')
    plt.show()
    

    【讨论】:

    • 感谢您的回答,以及您记录良好的代码!像往常一样,箭头的方向是正确的,但它们的长度不正确。尝试使用常数函数 u = 0.001 v = 0.001 w = 0.001,然后使用 u = 1 v = 1 w = 1 长度始终相同。
    • 关于赏金,Xorile 博士应该是 25 分,f5r5e5d 应该是 25 分......对不起,我不能分裂!
    • 看起来这应该在 matplotlib 2.0 中得到修复,它具有当前的候选发布版本和 beta 版本 - 虽然我不准备构建它们,但找不到安装 pkg
    猜你喜欢
    • 2017-03-30
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 2020-04-23
    相关资源
    最近更新 更多