问题描述
我想在Julia中绘制矢量场.我在此处找不到示例.此处有一些使用plotly
的示例,但是它们对我不起作用.我想通过plotlyjs
或plotly
绘制矢量场.
I want to plot a vector field in Julia. I could not find an example here.Here there are some examples using plotly
, however, they do not work for me. I would like to plot the vector field by plotlyjs
or plotly
.
这是Julia中的示例代码:
Here is an example code in 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示例:
Here is the Matlab example:
[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)
推荐答案
简短的答案:使用Plots.jl中的quiver
.
The short answer: use quiver
from Plots.jl.
quiver(x, y, quiver=(u, v))
在下面,我将尝试完全重新创建您在Matlab中显示的示例.
In the following, I'll attempt to fully recreate the example you showed in Matlab.
首先,我们将导入Plots
并启用plotly
后端.
First, we'll import Plots
and enable the plotly
backend.
using Plots
plotly()
我们需要定义类似于Matlab的meshgrid
的函数.由于绘图将对我们的点阵列进行操作而无论其尺寸如何,因此我选择仅使用repeat
并使用展平"的输出.
We need to define a function similar to Matlab's meshgrid
. Since Plots will operate on our arrays of points regardless of their dimensionality, I chose to simply use repeat
and use the "flattened" outputs.
meshgrid(x, y) = (repeat(x, outer=length(y)), repeat(y, inner=length(x)))
现在,我们可以使用与Matlab代码相同的逻辑来创建x
,y
,u
和v
.为了简洁起见,我们可以使用@.
宏将给定表达式中的所有调用向量化.
Now, we can create x
, y
, u
, and v
using the same logic as the Matlab code. For the sake of brevity, we can use the @.
macro to vectorize all calls in the given expression.
x, y = meshgrid(0:0.2:2, 0:0.2:2)
u = @. cos(x) * y
v = @. sin(x) * y
在这里,我们可以简单地使用Plots中的quiver
函数,将u
和v
作为2元组传递给关键字参数quiver
.
From here, we can simply use the quiver
function from Plots, passing u
and v
as a 2-tuple to the keyword argument quiver
.
quiver(x, y, quiver=(u, v))
结果接近Matlab输出,但似乎Plots.jl将箭头缩放为比在Matlab中更长.不过,这很容易解决.我们可以简单地将u
和v
乘以比例常数进行广播.
The result is close to the Matlab output, but it seems that Plots.jl scales the arrows to be longer than they are in Matlab. This is easily fixable, though; we can simply broadcast-multiply u
and v
by a scale constant.
scale = 0.2
u = @. scale * cos(x) * y
v = @. scale * sin(x) * y
这篇关于如何在Julia中绘制矢量场?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!