如何在Julia中绘制矢量场?

时间:2018-07-22 15:20:32

标签: plot julia plotly plotly.js

我想在Julia中绘制矢量场。我找不到示例hereHere中有一些使用plotly的示例,但是它们对我不起作用。我想用plotlyjsplotly来绘制矢量场。

这是Julia中的示例代码:

using Plots
pyplot()
x = collect(linspace(0,10,100));
X = repmat(x,1,length(x));
Y = repmat(x',length(x),1);
U = cos.(X.*Y);
V = sin.(X.*Y);
streamplot(X,Y,U,V)

这是Matlab示例:

[x,y] = meshgrid(0:0.2:2,0:0.2:2);
u = cos(x).*y;
v = sin(x).*y;

figure
quiver(x,y,u,v)

enter image description here

1 个答案:

答案 0 :(得分:4)

简短的答案:使用来自Plots.jl的quiver

quiver(x, y, quiver=(u, v))

在下面,我将尝试完全重新创建您在Matlab中显示的示例。

首先,我们将导入Plots并启用plotly后端。

using Plots
plotly()

我们需要定义一个类似于Matlab的meshgrid的函数。由于绘图将对我们的点阵列进行操作而无论其尺寸如何,因此我选择仅使用repeat并使用“展平”的输出。

 meshgrid(x, y) = (repeat(x, outer=length(y)), repeat(y, inner=length(x)))

现在,我们可以使用与Matlab代码相同的逻辑来创建xyuv。为了简洁起见,我们可以使用@.宏将给定表达式中的所有调用向量化。

x, y = meshgrid(0:0.2:2, 0:0.2:2)
u = @. cos(x) * y
v = @. sin(x) * y

从这里开始,我们可以简单地使用Plots中的quiver函数,将uv作为2元组传递给关键字参数quiver

quiver(x, y, quiver=(u, v))

Initial plot

结果接近Matlab输出,但是Plots.jl似乎将箭头缩放为比在Matlab中更长。不过,这很容易解决。我们可以简单地将uv乘以比例常数进行广播。

scale = 0.2
u = @. scale * cos(x) * y
v = @. scale * sin(x) * y

Final plot