# How can I plot the same data with two y-axes on the same plot?

82 ビュー (過去 30 日間)
Andrea 2014 年 6 月 11 日
コメント済み: Star Strider 2021 年 3 月 6 日
I have some error analysis that requires looking at absolute as well as percent error of some data. I toyed around with plotyy but it essentially plots the data twice with each y-axis. Anyone know how to plot the data once with one scale on the left y-axis (absolute error) and another scale on the right (percent error)
Thanks!
##### 1 件のコメント表示 なし非表示 なし
Geoff Hayes 2014 年 6 月 11 日

Isn't that what plotyy is for? See the first example at http://www.mathworks.com/help/matlab/ref/plotyy.html as it plots "two data sets on one graph using two y-axes".

サインインしてコメントする。

### 採用された回答

Star Strider 2014 年 6 月 12 日
This might do what you want:
x = 0:0.1:2*pi; % Create Data
y = 50 + 10*sin(x);
figure(1)
plotyy(x,y, x,y) % PlotYY
fcyy = get(gcf, 'Children') % Gets handles for both Y-axes
Ryax = fcyy(1); % Right axis handle
Lyax = fcyy(2); % Left axis handle
Lyaxt = get(fcyy(2), 'YTick') % Get Left axis ticks
LyaxDegC = round(10*(Lyaxt-32)/1.8)/10; % Convert to °C (or whatever you want)
set(Ryax, 'YTick',Lyaxt, 'YTickLabel', LyaxDegC) % New Y-tick values
I took a while for me to figure this out. It’s necessary to use ‘gcf’ to get the handles of the two Y-axes. Then, in order to put the right Y-axis ticks at the same places as the left axis ticks, do the conversion on the left axis ticks and then plot them on the right axis. Here, I did a °F to °C conversion. I don’t know how you want to calculate your percent errors, but the ‘LyaxDegC’ line (rename it and its reference in the following line) will do it. I decided to break it out into two lines rather than do it all in the ‘set’ line to make it easier to follow.
The plotyy documentation (that I didn’t think of reading until I completed this) suggests accessing the Y-axis values as:
[hAx,hLine1,hLine2] = plotyy(x,y1,x,y2);
then referring to ‘hAx(1)’ as the left axis handle and ‘hAx(2)’ as the right axis handle. That elinimates the ‘fcyy’ line in my code. The rest of my code remains unchanged.
##### 4 件のコメント表示 3 件の古いコメント非表示 3 件の古いコメント
Star Strider 2021 年 3 月 6 日
Juan Pedrosa — An appropriate request!
An updated (and slightly changed) version using yyaxis:
x = 0:0.1:2*pi; % Create Data
y = 50 + 10*sin(x);
figure
yyaxis left
plot(x,y, 'LineWidth',1.5) % Plot Left
Lyax = gca; % Left Axis Handle
yyaxis right
plot(x,y, '--', 'LineWidth',1.5) % Plot Right
Ryax = gca; % Right axis handle
Lyaxt = get(Lyax, 'YTick'); % Get Left axis ticks
LyaxDegC = round(10*(Lyaxt-32)/1.8)/10; % Convert to °C (or whatever you want)
set(Ryax, 'YTick',Lyaxt, 'YTickLabel', LyaxDegC) % New Y-tick values
.

サインインしてコメントする。

### その他の回答 (3 件)

Cedric Wannaz 2014 年 6 月 11 日

You probably made a mistake, how are you calling PLOTYY?
doc plotyy
and look at examples, and e.g. the following which works
x = 0:0.01:20;
y1 = 200*exp(-0.05*x).*sin(x);
y2 = 0.8*exp(-0.5*x).*sin(10*x);
figure % new figure
plotyy(x,y1,x,y2);
##### 2 件のコメント表示 1 件の古いコメント非表示 1 件の古いコメント
Cedric Wannaz 2014 年 6 月 11 日
Could you give an example with a few data points, and provide the code that you are using for plotting?

サインインしてコメントする。

Ranzige Erdnuss 2020 年 9 月 27 日

Hi
since plotyy is not recommended anymore, I made an similar approch for yyaxis:
ax = gca;
lLim=ax.YAxis(1).Limits;
rLim=lLim*conversionFaktorOrFun;
ax.YAxis(2).Limits=rLim;
ax.YAxis(1).Limits=lLim;
This following more complete script plots the new COVID-19 casee. Once per 100,000 residents on the left y-axis and once the total number on the right y-axis.
plot(dates, incidence, '.');
xlabel('date');
ylabel('daily new cases per 100,000 residents');
yyaxis('right');
plot(dates, incidence*population, '.', 'Color', 'none');
ylabel('total new infections');
ax = gca;
lLim=ax.YAxis(1).Limits;
rLim=lLim*population;
ax.YAxis(2).Limits=rLim;
ax.YAxis(1).Limits=lLim;
##### 1 件のコメント表示 なし非表示 なし
Star Strider 2020 年 9 月 27 日
Also, the original thread used R2014a, one release prior to R2014b, that introduced ‘HG2’, the new (and still current) handle graphics system. The original code will only work for release/version R2014a and those prior to it.

サインインしてコメントする。

SAFDAR RASOOL 2019 年 3 月 11 日
can we plot this double y plot with the simulink scope?

サインインしてコメントする。

### カテゴリ

Help Center および File ExchangeAxis Labels についてさらに検索

### Community Treasure Hunt

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

Start Hunting!