使用matplotlib箭头更改箭头的大小

Sir*_*irC 5 python matplotlib

我正在使用matplotlib中的箭来绘制矢量场.我想根据产生矢量场特定箭头的数据的数量来改变每个箭头的厚度大小.因此,我所寻找的不是箭头大小的一般比例变换,而是逐个自定义箭袋中箭头厚度的方法.可能吗?你能帮助我吗?

unu*_*tbu 9

linewidths参数来plt.quiver控制的箭头的厚度.如果您传递一维值的数组,则每个箭头的厚度不同.

例如,

widths = np.linspace(0, 2, X.size)
plt.quiver(X, Y, cos(deg), sin(deg), linewidths=widths)
Run Code Online (Sandbox Code Playgroud)

创建从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()
Run Code Online (Sandbox Code Playgroud)

产量

在此输入图像描述

  • 如果我们指定的颜色不是您的线条颜色,则会出现故障.请改用`width`关键字. (2认同)

nek*_*uuu 5

@unutbu 的解决方案在 matplotlib 2.0.0 之后没有用(请参阅此问题此拉取请求)。从 matplotlib 2.1.2 开始,似乎没有参数plt.quiver正式支持箭头宽度的一对一配置。但仍然保留了一些解决方法。

方法一

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

import matplotlib.pyplot as plt
import numpy as np

# original code by user423805
# /sf/answers/446068941/
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()
Run Code Online (Sandbox Code Playgroud)

上面代码的结果图像

方法2

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

import matplotlib.pyplot as plt
import numpy as np

# original code by user423805
# /sf/answers/446068941/
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()
Run Code Online (Sandbox Code Playgroud)

上面代码的结果图像

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

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