在 MATLAB 中用非笛卡尔坐标画一条线
Draw a line with non-Cartesian coordinates in MATLAB
MATLAB 的 surf
命令允许您将指定非笛卡尔 x-y 分量的可选 X
和 Y
数据传递给它。 (他们本质上改变了基础向量)。我希望将类似的参数传递给将画一条线的函数。
如何使用非笛卡尔坐标系绘制直线?
如果我的术语有点不对,我深表歉意。这在技术上仍然可能是笛卡尔 space 但它不会是 正方形 在 x 方向上的一个单位与 y 方向上的一个单位正交的意义上.如果您能纠正我的术语,我将不胜感激!
编辑:
下面更好地说明了我的意思:
命令:
datA=1:10;
datB=1:10;
X=cosd(8*datA)'*datB;
Y=datA'*log10(datB*3);
Z=ones(size(datA'))*cosd(datB);
XX=X./(1+Z);
YY=Y./(1+Z);
surf(XX,YY,eye(10)); view([0 0 1])
生成下图:
此处,X 和 Y 维度既不正交也不等 spaced。 x 中的一个单位可以对应于 x 方向上的 5 cm,但 x 中的下一个单位可以对应于 x 方向上的 2 cm + y 方向上的 1 cm。 我希望复制此功能,但画一条线而不是冲浪例如,我正在寻找一个函数,其中:
straightLine=[(1:10)' (1:10)'];
my_line(XX,YY,straightLine(:,1),straightLine(:,2))
会生成一条描绘冲浪图上红色方块的线。
Matlab 有许多内置函数可以帮助您。
在 2D 中,最简单的方法是 polar
,它允许您使用 theta
和 rho
向量制作图形:
theta = linspace(0,2*pi,100);
r = sin(2*theta);
figure(1)
polar(theta, r), grid on
所以,你会得到 this.
还有 pol2cart
函数可以将您的数据转换为 x
和 y
格式:
[x,y] = pol2cart(theta,r);
figure(2)
plot(x, y), grid on
这样看起来会稍微有点different
然后,如果我们将其扩展到 3D,则只剩下 plot3
。所以,如果你有这样的数据:
theta = linspace(0,10*pi,500);
r = ones(size(theta));
z = linspace(-10,10,500);
您需要使用带有 3 个参数的 pol2cart
来生成 this:
[x,y,z] = pol2cart(theta,r,z);
图(3)
plot3(x,y,z),网格
最后,如果你有球形数据,你有 sph2cart
:
theta = linspace(0,2*pi,100);
phi = linspace(-pi/2,pi/2,100);
rho = sin(2*theta - phi);
[x,y,z] = sph2cart(theta, phi, rho);
figure(4)
plot3(x,y,z),grid on
view([-150 70])
那会看起来 this way
我仍然不确定你输入的数据是关于什么的,以及你想要绘制什么。但是,从如何你想绘制它,我可以提供帮助。
当你打电话时
surf(XX,YY,eye(10)); view([0 0 1]);
并且只想获得 "red parts",即函数的最大值,您实际上是 selecting XX
、YY
矩阵的一个子集,使用对角矩阵作为指标。所以你可以手动 select 这些点,并使用 plot
将它们绘制成一条线:
Xplot = diag(XX);
Yplot = diag(YY);
plot(Xplot,Yplot,'r.-');
对 diag(XX)
的调用将获取矩阵 XX
的对角线元素,这正是您将 surf
与 z
数据根据 eye()
.
结果:
此外,如果您只是想按照示例中的说明进行操作,则无需使用矩阵来最终取出对角线。这是相同的结果,对输入向量使用逐元素运算:
datA = 1:10;
datB = 1:10;
X2 = cosd(8*datA).*datB;
Y2 = datA.*log10(datB*3);
Z2 = cosd(datB);
XX2 = X2./(1+Z2);
YY2 = Y2./(1+Z2);
plot(Xplot,Yplot,'rs-',XX2,YY2,'bo--','linewidth',2,'markersize',10);
legend('original','vector')
结果:
MATLAB 的 surf
命令允许您将指定非笛卡尔 x-y 分量的可选 X
和 Y
数据传递给它。 (他们本质上改变了基础向量)。我希望将类似的参数传递给将画一条线的函数。
如何使用非笛卡尔坐标系绘制直线?
如果我的术语有点不对,我深表歉意。这在技术上仍然可能是笛卡尔 space 但它不会是 正方形 在 x 方向上的一个单位与 y 方向上的一个单位正交的意义上.如果您能纠正我的术语,我将不胜感激!
编辑:
下面更好地说明了我的意思:
命令:
datA=1:10;
datB=1:10;
X=cosd(8*datA)'*datB;
Y=datA'*log10(datB*3);
Z=ones(size(datA'))*cosd(datB);
XX=X./(1+Z);
YY=Y./(1+Z);
surf(XX,YY,eye(10)); view([0 0 1])
生成下图:
此处,X 和 Y 维度既不正交也不等 spaced。 x 中的一个单位可以对应于 x 方向上的 5 cm,但 x 中的下一个单位可以对应于 x 方向上的 2 cm + y 方向上的 1 cm。 我希望复制此功能,但画一条线而不是冲浪例如,我正在寻找一个函数,其中:
straightLine=[(1:10)' (1:10)'];
my_line(XX,YY,straightLine(:,1),straightLine(:,2))
会生成一条描绘冲浪图上红色方块的线。
Matlab 有许多内置函数可以帮助您。
在 2D 中,最简单的方法是 polar
,它允许您使用 theta
和 rho
向量制作图形:
theta = linspace(0,2*pi,100);
r = sin(2*theta);
figure(1)
polar(theta, r), grid on
所以,你会得到 this.
还有 pol2cart
函数可以将您的数据转换为 x
和 y
格式:
[x,y] = pol2cart(theta,r);
figure(2)
plot(x, y), grid on
这样看起来会稍微有点different
然后,如果我们将其扩展到 3D,则只剩下 plot3
。所以,如果你有这样的数据:
theta = linspace(0,10*pi,500);
r = ones(size(theta));
z = linspace(-10,10,500);
您需要使用带有 3 个参数的 pol2cart
来生成 this:
[x,y,z] = pol2cart(theta,r,z);
图(3)
plot3(x,y,z),网格
最后,如果你有球形数据,你有 sph2cart
:
theta = linspace(0,2*pi,100);
phi = linspace(-pi/2,pi/2,100);
rho = sin(2*theta - phi);
[x,y,z] = sph2cart(theta, phi, rho);
figure(4)
plot3(x,y,z),grid on
view([-150 70])
那会看起来 this way
我仍然不确定你输入的数据是关于什么的,以及你想要绘制什么。但是,从如何你想绘制它,我可以提供帮助。
当你打电话时
surf(XX,YY,eye(10)); view([0 0 1]);
并且只想获得 "red parts",即函数的最大值,您实际上是 selecting XX
、YY
矩阵的一个子集,使用对角矩阵作为指标。所以你可以手动 select 这些点,并使用 plot
将它们绘制成一条线:
Xplot = diag(XX);
Yplot = diag(YY);
plot(Xplot,Yplot,'r.-');
对 diag(XX)
的调用将获取矩阵 XX
的对角线元素,这正是您将 surf
与 z
数据根据 eye()
.
结果:
此外,如果您只是想按照示例中的说明进行操作,则无需使用矩阵来最终取出对角线。这是相同的结果,对输入向量使用逐元素运算:
datA = 1:10;
datB = 1:10;
X2 = cosd(8*datA).*datB;
Y2 = datA.*log10(datB*3);
Z2 = cosd(datB);
XX2 = X2./(1+Z2);
YY2 = Y2./(1+Z2);
plot(Xplot,Yplot,'rs-',XX2,YY2,'bo--','linewidth',2,'markersize',10);
legend('original','vector')
结果: