142 views (last 30 days)

NOTE: Question has been updated.

Hello all,

I want to plot a matrix (37 x 10) represented by sum_ET10 with 2 different y axis scales; km^3/year (original unit) on y axis lhs & mm/year (new unit) on y axis rhs. My code is shown below; I have also included an image below. Currently, my graph is still incorrect. What I want to do is to have a single plot as opposed to the two plots that I'm getting

%% Getting a 37 x 10 matrix of sum_ET10 & sum_area

decade = 10;

sum_area = squeeze(sum(reshape(area,size(area,1),decade,[]),2)/10);

sum_ET10 = squeeze(sum(reshape(ET,size(ET,1),decade,[]),2)/10);

% Plot the results

x_decade = 1:10;

f1 = figure(1);

x1 = axes;

plot(x_decade,sum_ET10(1,:),'-ok');

% Query the YTicks

yt = get(x1,'YTick');

% Create new axis based on existing axis

x2 = copyobj(x1,f1);

% Set new axis transparent

set(x2,'Color','none')

% Remove XTicks

set(x2,'Xtick',[])

% Display the YTicks on the right side

set(x2,'YAxisLocation','right')

% Converting values to mm/year

mm_sum_ET10 = yt/2199000*1000000;

% Update labels

set(x2,'YTickLabel',mm_sum_ET10)

grid on;

xlabel(x1,'Decade');

ylabel(x1,'km^3/year');

ylabel(x1,'mm/year');

Any help is appreciated. This is my first time doing different scaled axes, so I'm in need of help.

Thank you.

Adam Danz
on 5 Feb 2020

Edited: Adam Danz
on 5 Feb 2020

You should be using yyaxis instead of overlaying a 2nd axes which can lead to all sorts of problems.

Demo:

figure()

yyaxis left

plot(rand(1,20)*1000);

yyaxis right

set(gca, 'ytick', 0:10:100, 'ylim', [0,100], 'Ycolor', 'k')

See the link I provided for examples of yyaxis plots.

update

Applying that to your code would look something like this. The important part is to make sure the y limits of both y axes are set so that ylim(axis1) and ylim(axis2) are merely a conversion of each other. See the two lines below with the tag #important where you should make sure you're scaling the axes correctly.

% Plot the results

figure();

yyaxis left

plot(x_decade,sum_ET10(1,:),'-ok');

set(gca, 'YLim', [min(sum_ET10(1,:)), max(sum_ET10(1,:))]) % #important

yyaxis right

% Converting values to mm/year

mm_sum_ET10 = yt/2199000*1000000; % I assume yt is a vector

set(gca,'YTick',mm_sum_ET10, 'YLim', [min(mm_sum_ET10), max(mm_sum_ET10)]) % #important

ylabel('mm/year');

% go back to left axes (main axes)

yyaxis left

grid on;

xlabel('Decade');

ylabel('km^3/year');

Adam Danz
on 5 Feb 2020

Adam Danz
on 6 Feb 2020

Looking better! Set the ytick and ylim properties correctly. See the 2nd #important tag I referred to. Insert the correct values there.

I don't have access to your variables so I can only guess at what's going on. The idea is that the y ticks of the 2nd axis should be a direct conversion of the y ticks of the first axis. Likewise, the y limit of the 2nd axis should be a direct conversion of the y limit of the first axis. There's no need to use YTickLabel since your tick labels are numeric.

It would look something like this

yyaxis left

ax1 = gca();

yt = get(ax1,'YTick');

yl = ylim(ax1);

% convert

ytConverted = yt/2199000*1000000;

ylConverted = yl/2199000*1000000;

yyaxis right

set(gca,'YTick',ytConverted, 'YLim', ylConverted])

Opportunities for recent engineering grads.

Apply TodayFind the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!
## 1 Comment

## Direct link to this comment

https://nl.mathworks.com/matlabcentral/answers/503702-plot-same-data-set-on-two-different-y-axis-scales#comment_793681

⋮## Direct link to this comment

https://nl.mathworks.com/matlabcentral/answers/503702-plot-same-data-set-on-two-different-y-axis-scales#comment_793681

Sign in to comment.