... (to line 195)
# Add arrows half way along each trajectory.
s = np.cumsum(np.sqrt(np.diff(tx) ** 2 + np.diff(ty) ** 2))
n = np.searchsorted(s, s[-1] / 2.)
arrow_tail = (tx[n], ty[n])
arrow_head = (np.mean(tx[n:n + 2]), np.mean(ty[n:n + 2]))
... (after line 196)
将该部分更改为此将完成此技巧(更改n的分配):
... (to line 195)
# Add arrows half way along each trajectory.
s = np.cumsum(np.sqrt(np.diff(tx) ** 2 + np.diff(ty) ** 2))
n = np.searchsorted(s, s[-1]) ### THIS IS THE EDITED LINE! ###
arrow_tail = (tx[n], ty[n])
arrow_head = (np.mean(tx[n:n + 2]), np.mean(ty[n:n + 2]))
... (after line 196)
import matplotlib.pyplot as plt
import numpy as np
w = 3
Y, X = np.mgrid[-w:w:8j, -w:w:8j]
U = -Y
V = X
norm = np.sqrt(U**2 + V**2)
norm_flat = norm.flatten()
start_points = np.array([X.flatten(),Y.flatten()]).T
plt.clf()
scale = .2/np.max(norm)
plt.subplot(121)
plt.title('scaling only the length')
for i in range(start_points.shape[0]):
plt.streamplot(X,Y,U,V, color='k', start_points=np.array([start_points[i,:]]),minlength=.95*norm_flat[i]*scale, maxlength=1.0*norm_flat[i]*scale,
integration_direction='backward', density=10, arrowsize=0.0)
plt.quiver(X,Y,U/norm, V/norm,scale=30)
plt.axis('square')
plt.subplot(122)
plt.title('scaling length, arrowhead and linewidth')
for i in range(start_points.shape[0]):
plt.streamplot(X,Y,U,V, color='k', start_points=np.array([start_points[i,:]]),minlength=.95*norm_flat[i]*scale, maxlength=1.0*norm_flat[i]*scale,
integration_direction='backward', density=10, arrowsize=0.0, linewidth=.5*norm_flat[i])
plt.quiver(X,Y,U/np.max(norm), V/np.max(norm),scale=30)
plt.axis('square')
5条答案
按热度按时间kokeuurv1#
如果你看一下streamplot.pymatplotlib中包含的www.example.com,在第196 - 202行(ish,idk,如果这在不同版本之间发生了变化-我在matplotlib 2.1.2上),我们会看到以下内容:
将该部分更改为此将完成此技巧(更改n的分配):
如果您修改此设置以将箭头放在末尾,则可以生成更符合您喜好的箭头。
此外,从函数顶部的文档中,我们可以看到以下内容:
线宽可以是
numpy.ndarray
,如果你能预先计算出你想要的箭头宽度,你就可以在画箭头的时候修改铅笔宽度。看起来这部分已经为你做好了。因此,结合缩短箭头maxlength,增加密度,添加start_points,以及调整函数将箭头放在末尾而不是中间,您可以获得所需的图形。
通过这些修改和以下代码,我能够得到更接近您想要的结果:
tl;dr:复制源代码,并将其更改为将箭头放在每个路径的末尾,而不是中间。然后使用您的流图而不是matplotlib流图。
编辑:我得到的线宽变化
1hdlvixo2#
从David Culbreth's修改开始,我rewrote块的
streamplot
函数实现所需的行为。稍微太多了,无法在这里全部指定,但它包含了长度规范化方法并禁用了轨迹重叠检查。我已经附加了新curved quiver
函数与原始streamplot
和quiver
的两个比较。第一节第一节第一节第一节第一次
7gs2gvoe3#
这里有一种在vanilla pyplot中获得所需输出的方法(即,不修改streamplot函数或任何花哨的东西)。提醒一下,目标是可视化带有弯曲箭头的向量场,其长度与向量的范数成比例。
诀窍是:
1.制作从给定点向后追踪的无箭头的流线图(请参见)
1.从那个点画一个箭袋。把箭袋做得足够小,这样只能看到箭
1.在循环中对每个种子重复1.和2.,并将流图的长度缩放为与向量的范数成比例。
结果如下:
kupeojn64#
查看一下
streamplot()
的文档,可以在这里找到--如果您使用类似streamplot( ... ,minlength = n/2, maxlength = n)
的东西,其中n
是所需的长度--您将需要稍微处理这些数字以获得所需的图形您可以使用
start_points
控制点,如@JohnKoch提供的示例所示这里有一个我如何用
streamplot()
控制长度的例子--它几乎是从上面的例子中直接复制/粘贴/裁剪。编辑:使它更漂亮,虽然仍然不完全是我们要找的。
rqqzpn5f5#
我试着在matplotlib上打开一个PR,在his answer above中包含Kieran Hunt代码的更新+简化版本。但是,它被认为是非核心可视化,因此必须是第三方贡献。对于那些感兴趣的人,请查看相应的matplotlib github issue