MATLAB Quiver - 微小的箭头

5
我正在尝试使用MATLAB中的quiver函数绘制x和y速度。
我有x、y、u和v数组(具有它们通常的含义),大小为100x100。
因此,我的quiver图密集,除非我放大,否则看不到箭头。
类似于这样:quiver not drawing arrows just lots of blue, matlab
请看我的图:My quiver plot
有没有办法使quiver图变得稀疏一些(并且箭头更大)? 我计划将x轴范围剪切为0-4。 但除此之外还有什么方法吗?
由于准确性问题,我无法使网格变得稀疏。 但是,如果需要使图表看起来更好,我愿意忽略一些精细的数据点。
2个回答

8
您可以通过绘制(假设您的数据在数组中)减少数量的箭头,例如:
quiver(x(1:2:end,1:2:end),y(1:2:end,1:2:end),u(1:2:end,1:2:end),v(1:2:end,1:2:end))

在这个例子中,2表示我们只绘制四分之一数量的箭头。当然,您可以更改它,只要您更改所有的2,以便使所有数组的大小适当。

如果您想更改箭头长度,有两个选项。首先,您可以使用缩放选项scale=2按指定比例缩放箭头,或者如果您想让所有箭头都具有相同的长度,则可以规范化速度。这样做会损失信息,因为您无法通过查看箭头来比较速度的大小,但在某些情况下可能会有用。您可以通过将uv除以sqrt(u.^2+v.^2)(在您希望绘制箭头的点上)来实现这一点。

希望这有所帮助并且能够清楚地解释一切。


嗯...我也有类似的经历... 但是以一种较为繁琐的方式...先将筛选后的矩阵存储起来。 - tumchaaditya
我通常也会存储筛选后的矩阵,这样可以更轻松地重复使用它们,但为了说明我的意思,直接将它们放入“quiver”命令中会更简单。 - David

1
你需要将间隔值调大一些,以使矩阵更加稀疏。
这非常密集:
1:0.0001:100

这非常稀疏:
1:1:100

编辑:

如果您有图像处理工具包,您可以使用imresize函数来减少矩阵分辨率:

newMat = imresize(oldMat, newSize); 

如果您没有工具箱,那么您可以使用interp2插值方法类似于this example进行调整大小:

orgY = 1:size(oldMat,1); 
orgX = 1:size(oldMat,2); 
[orgX,orgY] = meshgrid(orgX ,orgY); 
newY = linspace(1,size(mat,1),newHeight); 
newX = linspace(1,size(mat,2),newWidth); 
[newX,newY] = meshgrid(newX,newY); 
newMat = interp2(orgX,orgY,mat,newX,newY);

感谢@David,如果您只想删除一些单独的点,可以简单地执行以下操作:

xPlot=x(1:2:end)

实际上数据来自Fortran程序,我无法在那里更改网格大小,因为那会影响准确性。我能让MATLAB忽略一些细节吗?例如,我的当前x和y的网格是0:0.05:5。我能让MATLAB只考虑0:0.2:5处的点吗? - tumchaaditya
是的。您可以创建新变量,例如 xPlot=x(1:2:end),这将在仅使用 xy 的点数的 1/4 处绘制箭头。 - David
1
如果您不希望丢失太多信息,您需要进行某种插值而不是直接删除中间点。 - Samuel O'Malley
1
@ Samuel,我认为您不会失去信息,因为箭头仅提供有关正在绘制的点的信息。由于箭头仅绘制数据所在的位置,因此不需要插值。 - David
我认为跳过比插值更好,因为它会在每个点上给我精确的值。如果我进行插值(实际上这将是插值的反向),那么一个点的值将受到相邻点的影响,而这实际上并不是这种情况。 - tumchaaditya
好的,听起来不错。@David,你想发表那个答案吗? - Samuel O'Malley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接