How to rotate image and axes together on Matlab?

匿名 (未验证) 提交于 2019-12-03 02:29:01

问题:

Code 1 where flipping vertically and/or horizontally does not affect axes(); Code 2 where proposed solution does not yield the expected output

close all; clear all; clc; x = [5 8]; y = [3 6]; C = [0 2 4 6; 8 10 12 14; 16 18 20 22]; C2 = C(:,end:-1:1,:);           %# horizontal flip C3 = C(end:-1:1,:,:);           %# vertical flip C4 = C(end:-1:1,end:-1:1,:);    %# horizontal+vertical flip  % https://stackoverflow.com/a/4010203/54964 subplot(2,2,1), imagesc(x,y,C) subplot(2,2,2), imagesc(x,y,C2) subplot(2,2,3), imagesc(x,y,C3) subplot(2,2,4), imagesc(x,y,C4)  %% Rotations of axes() unsuccessfully  % https://stackoverflow.com/a/15071734/54964 figure subplot(2,2,1), imagesc(x,y,C) x = linspace(1, size(C, 2), numel(x)); % reverse only x set(gca, 'XTick', x, 'XTickLabel', x) subplot(2,2,2), imagesc(x,y,C2)  x = linspace(1, size(C, 2), numel(x)); % reverse back x set(gca, 'XTick', x, 'XTickLabel', x)  % reverse y y = linspace(1, size(C, 1), numel(y)); set(gca, 'YTick', y, 'YTickLabel', flipud(y(:))) subplot(2,2,3), imagesc(x,y,C3)  x = linspace(1, size(C, 2), numel(x)); % now both x,y reversed set(gca, 'XTick', x, 'XTickLabel', x) subplot(2,2,4), imagesc(x,y,C4) 

Fig. 1 Output where axis stay untouched but images are flipped correctly, Fig. 2 Output from attempt with moving xticks/yticks

Expected output:

  • Fig.1 (top-left) all correct in axes with figure
  • Fig.2 (top-right) y-axis correct but x-axis from 8 to 5
  • Fig.3 (lower-left) y-axis from 6 to 3 but x-axis correct
  • Fig.4 (lower-right) y-axis correct but x-axis from 3 to 6

Attempt 2

Code

% 1 start of vector 2 end of vector 3 length of vector  figure subplot(2,2,1), imagesc(x,y,C) x = linspace(size(C, 2), 1, numel(x)); % reverse only x set(gca, 'XTick', x, 'XTickLabel', x) subplot(2,2,2), imagesc(x,y,C2)  x = linspace(1, size(C, 2), numel(x)); % reverse back x set(gca, 'XTick', x, 'XTickLabel', x)   y = linspace(size(C, 1), 1, numel(y)); % reverse y set(gca, 'YTick', y, 'YTickLabel', flipud(y(:))) subplot(2,2,3), imagesc(x,y,C3)  x = linspace(size(C, 2), 1, numel(x)); % now both x,y reversed set(gca, 'XTick', x, 'XTickLabel', x) y = linspace(1, size(C, 1), numel(y)); % reverse y set(gca, 'YTick', y, 'YTickLabel', flipud(y(:))) subplot(2,2,4), imagesc(x,y,C4) 

Output

Error using matlab.graphics.axis.Axes/set While setting the 'XTick' property of 'Axes': Value must be a vector of type single or double whose values increase  Error in test_imagesc_subplot_figure (line 26) set(gca, 'XTick', x, 'XTickLabel', x) 

Eskapp's proposal

I do unsuccessfully the following but no change on Fig. 2; the first row of figures stay in the same increasing order of xaxis; I also tried instead of reverse - normal

figure subplot(2,2,1), imagesc(x,y,C) x = linspace(1, size(C, 2), numel(x)); % reverse only x set(gca,'xdir','reverse') subplot(2,2,2), imagesc(x,y,C2) 
  • Output of Fig. 1 and Fig. 2 axis stay the same

Studying EBH's answer

Output in the y-axis label when using set(gca,'XTick',x,'XTickLabel',x, 'YTick',y,'YTickLabel',fliplr(y)) with variables y=linspace(0,180,181); x=0:0.5:10

Matlab: 2016a
OS: Debian 8.5 64 bit
Hardware: Asus Zenbook UX303UA

回答1:

If I correctly understand your question, then this code does what you look for:

x = 5:8; y = 3:6; C = reshape(0:2:22,4,3).'; C2 = fliplr(C); % horizontal flip C3 = flipud(C); % vertical flip C4 = rot90(C,2); % horizontal+vertical flip  % the answer starts here: subplot(2,2,1), imagesc(x,y,C) set(gca,'XTick',x,'XTickLabel',x,...      'YTick',y,'YTickLabel',y) subplot(2,2,2), imagesc(x,y,C2) set(gca,'XTick',x,'XTickLabel',fliplr(x),...      'YTick',y,'YTickLabel',y) subplot(2,2,3), imagesc(x,y,C3) set(gca,'XTick',x,'XTickLabel',x,...      'YTick',y,'YTickLabel',fliplr(y)) subplot(2,2,4), imagesc(x,y,C4) set(gca,'XTick',x,'XTickLabel',fliplr(x),...      'YTick',y,'YTickLabel',fliplr(y)) 

the result:

I changed you x and y from 2-element vectors, but it works also if:

x = [5 8]; y = [3 6]; 

BTW...

Instead of manipulating C and create C2...C4, you can just write:

subplot 221, imagesc(x,y,C) subplot 222, imagesc(fliplr(x),y,C) subplot 223, imagesc(x,fliplr(y),C) subplot 224, imagesc(fliplr(x),fliplr(y),C) 

and add the manipulation on the axis after each call to subplot like before.


Edit:

Using your sizes and limits of the vectors:

x = linspace(0,10,6); y = linspace(0,180,19); % no need to plot each label N = 3613; C = diag(1:N)*ones(N)+rot90(diag(1:N)*ones(N)); % some arbitrary matrix  

where all the rest of the code above remains the same, I get the following result:



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!