我正在MATLAB中模拟粒子的运动。我正在使用quiver
来获取他们运动的方向。但是,我只希望箭头没有茎。我无法实现这一目标。
我尝试使用以下内容,
quiver(x,y,vx,vy,'LineStyle','none','ShowArrowHead','on')
摆脱茎,但箭头也没有显示。有办法解决吗?
答案 0 :(得分:2)
'LineStyle','none'
无效,因为样式既适用于茎,也适用于头部,因此将其设置为none
会同时隐藏两者。
这可以通过挖掘Quiver
对象的一些未记录的属性来解决。探索Quiver
对象的属性(使用struct(<handle to quiver plot>)
),我们可以看到颤动图具有NodeChildren
属性,并且它由4个元素组成,
>> hq = quiver(x,y,u,v);
>> hq.NodeChildren
ans =
4×1 graphics array:
ListOfPointsHighlight
LineStrip
LineStrip
Marker
您在上方看到的LineStrip
对象从上到下对应于尾巴和头部。在这里,只需通过其Visible
属性隐藏尾巴即可。
[x,y] = meshgrid(0:0.2:2,0:0.2:2);
u = cos(x).*y;
v = sin(x).*y;
figure();
hq = quiver(x,y,u,v);
pause(0.1); % this appears to help
hq.NodeChildren(2).Visible = 'off';
结果:
在R2019a上测试。
答案 1 :(得分:0)
在这种情况下,颤振器将绘制箭头偏离数据点的位置,这些位置通常会出现在箭头柄的末端。 使用MATLAB的quiver()命令很难控制杆长到杆头的大小,绘制闭合的箭头或修改箭形箭头的形状和位置。
另一种选择是文件交换arrow3()函数,可在此处使用:
https://www.mathworks.com/matlabcentral/fileexchange/14056-arrow3
arrow3()函数在此处有许多示例:
使用quiver()函数的代码代替arrow3()的示例
[x,y] = meshgrid(0:0.2:2,0:0.2:2);
u = cos(x).*y;
v = sin(x).*y;
figure();
%hq = quiver(x,y,u,v);
p1 = [x(:) y(:)]; % data start point
u = u(:); v=v(:);
arrow3(p1,p1+0.01*[u,v],'k',1,2); % create small (0.01) arrow stems