【发布时间】:2018-05-30 01:48:06
【问题描述】:
我正在使用 matplotlib 中的 quiver 来绘制矢量场。我想 改变每个箭头的粗细大小取决于 产生矢量场的特定箭头的数据数量。所以 我正在寻找的不是箭头大小的一般比例转换,而是方式 逐一自定义箭袋中箭头的粗细。 可能吗?你能帮帮我吗?
【问题讨论】:
标签: python matplotlib
我正在使用 matplotlib 中的 quiver 来绘制矢量场。我想 改变每个箭头的粗细大小取决于 产生矢量场的特定箭头的数据数量。所以 我正在寻找的不是箭头大小的一般比例转换,而是方式 逐一自定义箭袋中箭头的粗细。 可能吗?你能帮帮我吗?
【问题讨论】:
标签: python matplotlib
plt.quiver 的 linewidths 参数控制箭头的粗细。如果将一维数组值传递给它,则每个箭头的粗细都不同。
例如,
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()
产量
【讨论】:
width 关键字。
@unutbu 的解决方案在 matplotlib 2.0.0 之后就没有用了(参见this issue 和this 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:
所以请将
widthkwarg 与units一起使用;linewidths仅用于在明确请求不同颜色的轮廓时控制轮廓粗细。
【讨论】: