# Plot same data set on two different y axis scales

142 views (last 30 days)
Elizabeth Yeap on 5 Feb 2020
Edited: Adam Danz on 6 Feb 2020
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
% Plot the results
f1 = figure(1);
x1 = axes;
% 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;
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.

#### 1 Comment

Adam Danz on 5 Feb 2020
Regarding the error, look at the size of sum_area and the size of yt. The ./ notation means that your dividing element i of the first variable by element i of the 2nd variable. That requires both variables having the same number of elements.
You need to copy the axis before plotting the line. But still, this is a bad solution. use yyaxis.

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
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;
ylabel('km^3/year');

Show 1 older comment
Adam Danz on 5 Feb 2020
Do you see two plots in the demo i provided? No. yyaxis merely controls which vertical axis, left or right, you're working with. If you're having trouble implementing the solution show me the code and i can help straighten it out.
Elizabeth Yeap on 6 Feb 2020
@Adam Danz, I implemented your code with an additional line below; and am getting the figure below; How do I get the y values on the right axis to be at the same position as the left axis values?
yt = get(gca, 'YTick'); % after yyaxis right
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])

R2018b

### Community Treasure Hunt

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

Start Hunting!