【问题标题】:Change size of arrows using matplotlib quiver使用 matplotlib quiver 更改箭头的大小
【发布时间】:2018-05-30 01:48:06
【问题描述】:

我正在使用 matplotlib 中的 quiver 来绘制矢量场。我想 改变每个箭头的粗细大小取决于 产生矢量场的特定箭头的数据数量。所以 我正在寻找的不是箭头大小的一般比例转换,而是方式 逐一自定义箭袋中箭头的粗细。 可能吗?你能帮帮我吗?

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    plt.quiverlinewidths 参数控制箭头的粗细。如果将一维数组值传递给它,则每个箭头的粗细都不同。

    例如,

    widths = np.linspace(0, 2, X.size)
    plt.quiver(X, Y, cos(deg), sin(deg), linewidths=widths)
    

    创建从 0 到 2 的线宽。


    import matplotlib.pyplot as plt
    import numpy as np
    sin = np.sin
    cos = np.cos
    
    # http://stackoverflow.com/questions/6370742/#6372413
    xmax = 4.0
    xmin = -xmax
    D = 20
    ymax = 4.0
    ymin = -ymax
    x = np.linspace(xmin, xmax, D)
    y = np.linspace(ymin, ymax, D)
    X, Y = np.meshgrid(x, y)
    # plots the vector field for Y'=Y**3-3*Y-X
    deg = np.arctan(Y ** 3 - 3 * Y - X)
    widths = np.linspace(0, 2, X.size)
    plt.quiver(X, Y, cos(deg), sin(deg), linewidths=widths)
    plt.show()
    

    产量

    【讨论】:

    【解决方案2】:

    @unutbu 的解决方案在 matplotlib 2.0.0 之后就没有用了(参见this issuethis pull request)。从 matplotlib 2.1.2 开始,似乎没有 plt.quiver 的参数,它正式支持箭头宽度的一对一配置。但仍有一些解决方法。

    方法一

    只需使用 Python 的循环和 width 参数。对于大数据,这会很慢。

    import matplotlib.pyplot as plt
    import numpy as np
    
    # original code by user423805
    # https://stackoverflow.com/a/6372413/5989200
    xmax = 4.0
    xmin = -xmax
    D = 20
    ymax = 4.0
    ymin = -ymax
    
    for y in np.linspace(ymin, ymax, D):
        for x in np.linspace(xmin, xmax, D):
            deg = np.arctan(y ** 3 - 3 * y - x)
            w = 0.005 * (y - ymin) / (ymax - ymin)  # just example...
            plt.quiver(x, y, np.cos(deg), np.sin(deg), width=w)
    
    plt.show()
    

    方法二

    这只是一种解决方法,但如果我们设置edgecolors,则可以使用linewidths

    import matplotlib.pyplot as plt
    import numpy as np
    
    # original code by user423805
    # https://stackoverflow.com/a/6372413/5989200
    xmax = 4.0
    xmin = -xmax
    D = 20
    ymax = 4.0
    ymin = -ymax
    x = np.linspace(xmin, xmax, D)
    y = np.linspace(ymin, ymax, D)
    X, Y = np.meshgrid(x, y)
    deg = np.arctan(Y ** 3 - 3 * Y - X)
    widths = np.linspace(0, 2, X.size)
    plt.quiver(X, Y, np.cos(deg), np.sin(deg), linewidths=widths, edgecolors='k')
    plt.show()
    

    请注意,efiring,matplotlib 的维护者之一,said

    所以请将width kwarg 与units 一起使用; linewidths 仅用于在明确请求不同颜色的轮廓时控制轮廓粗细。

    【讨论】:

      猜你喜欢
      • 2020-07-10
      • 2015-10-18
      • 2016-04-15
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 2015-05-29
      • 2022-10-13
      • 1970-01-01
      相关资源
      最近更新 更多