【问题标题】:Changing perspective of Matlab plots改变 Matlab 绘图的视角
【发布时间】:2015-02-11 16:00:06
【问题描述】:

假设我有一个矩阵hey 15x15。我想将矩阵的值绘制为二维图以便更好地可视化。但 Matlab 的绘图约定原点位于左下角,正 x 沿左侧,正 y 沿从原点向上的方向。

但我想让我的绘图使得原点位于左上角,+ve x 位于左侧,+ve y 位于下方。

所以我只是使用了一个小技巧。

figure
axis([0 15 -15 0]);
daspect([1,1,1])
hold on
rectangle('Position',[3,-6,2,3],...
          'EdgeColor','black',...
          'LineWidth',2,...
          'FaceColor','cyan')
for i=1:nrows
    for j=1:ncolumns
        if char(hey(i,j))=='^'
            text(j,-i,'^');
        elseif char(hey(i,j))=='>'
            text(j,-i,'>');
        elseif char(hey(i,j))=='v'
            text(j,-i,'v');
        elseif char(hey(i,j))=='<'
            text(j,-i,'<');
        end
        if obstacle(i,j)==1
            text(j,-i,'X');
        end
    end
end
text(goalY,-goalX,'T');

我进行了转换(x,y)--&gt;(y,-x)。但缺点是轴随后沿 y 编号为 -1 到 -15。但是,如果读者在上面关注,我只想绘制矩阵值,并且在矩阵中,对于我的情况,y 从 1 向下运行 +ve 到 15。 所以我希望绘图显示 +1 到 +15 沿 y 原点在左上角,x 按原样毕业,但 +1 到 +15 的值写在绘图顶部而不是下面。

如何做到这一点?在极端情况下,我也愿意将矩阵hey 转移到另一个软件,该软件可以按照我的意愿绘制漂亮的图。如果这两种方法中的任何一种可行,请给出具体步骤。

编辑: 在使用了以下有用的方法后,我仍然不得不使用像 plot (j,i) 这样的技巧,而不是无辜的 plot(i,j)。这是因为矩阵 (i,j) 映射到图形图 (x,y)x=j, y=i。有类似的解决方法吗?矩阵元素是(行#,列#)。但在二维 matlab 图中,我们将其位置表示为 (column #, row #)。我只是在猜测是否有一些 matlab 内置函数来处理这个问题。就像我会给它(行#,列#)但matlab会绘制(列#,行#)。有这样的功能吗?

【问题讨论】:

  • Luis Mendo 在下面的回答应该告诉您您需要。除此之外,您应该查看 Matlab 图形系统的文档,特别是 Axes properties。图形系统非常通用,很多问题不用花招就能解决。

标签: matlab


【解决方案1】:

我认为axis ij 做你想做的事:

axis ij 将坐标系原点放在左上角。 i 轴是垂直的,值从上到下递增。 j-轴是水平的,数值从左到右递增。

要将 x 轴定位在顶部,请将轴的 'XAxisLocation' 更改为 'top'(默认为 'bottom')。

例子:

x = 1:10;
y = x.^2;
plot(x,y)
axis ij
set(gca,'XAxisLocation','top') 

原始图(上述代码的第 1-3 行):

axis ij 之后(第 4 行):

set(gca,'XAxisLocation','top')(第 5 行)之后:

【讨论】:

  • 哦,太好了,我不知道这个命令哈哈谢谢+1。
  • 对于漂亮的单线解决方案,+1。
  • @Benoit_11 实际上,如果您看到axis 代码,您会发现axis ij 只是将'YDir' 属性设置为'reverse',就像您所做的那样
  • @LuisMendo 我的解决方案中仍然缺少一个链接。请参阅编辑。
  • @giffy 也许是view([90 90])view([-90 90])?
【解决方案2】:

如果我正确地遵循你正在寻找轴XAxisLocationYDir 属性。您可以将它们分别设置为topreverse 以获得您想要的输出。您还可以将 XTick 属性设置为 1:15 以显示从 1 到 15 的每个值。

例子:

clear
clc

%// Create dummy data
[x,y] = meshgrid(1:15,1:15);
u = cos(x).*y;
v = sin(x).*y;

figure
quiver(x,y,u,v)


set(gca,'XAxisLocation','top','XTick',1:15,'YDir','reverse')

hold on

%// I changed the coordinated of the rectangle to fit with the change in
%y-axis.
rectangle('Position',[3,3,2,3],...
          'EdgeColor','black',...
          'LineWidth',2,...
          'FaceColor','cyan')

axis([0 15 0 15])

这给出了以下内容:

【讨论】:

  • Luis 的答案更易于理解,并且最有可能被选择实施,但您的拜占庭方法允许解决其他几个问题。感谢您对XAxisLocation YDir 进行技术观察。
  • 我最初没有在 OP 中看到“x 轴在顶部”的要求。我刚刚将其添加到我的答案中,现在我看到您首先做到了。希望你不要介意!
  • @Benoit_11 我还在我的问题中提到矩阵(i,j) 映射到图形(x,y)x=j, y=i。所以我仍然必须使用像plot (j,i) 这样的技巧,而不是无辜的plot(i,j)。有没有类似的解决方法?
  • 没问题@LuisMendo!
猜你喜欢
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 2012-08-24
  • 2012-08-29
  • 1970-01-01
  • 2016-10-08
  • 2012-01-23
  • 1970-01-01
相关资源
最近更新 更多