Multiple y axes on single x axis
現在この質問をフォロー中です
- フォローしているコンテンツ フィードに更新が表示されます。
- コミュニケーション基本設定に応じて電子メールを受け取ることができます。
エラーが発生しました
ページに変更が加えられたため、アクションを完了できません。ページを再度読み込み、更新された状態を確認してください。
古いコメントを表示
Hello, I want to know how to do three y axis one next to one on left side with space. i'm trying but not getting it properly.
VarName1=A0006_charge(:,1);
VarName2=A0006_charge(:,2);
VarName3=A0006_charge(:,3)/3600;
VarName4=A0006_charge(:,4);
plot(VarName3, VarName1, VarName3, VarName2, VarName3, VarName4);
ylim([-1 5])

Like this.
採用された回答
Try a function from the file exchange
- https://www.mathworks.com/matlabcentral/fileexchange/9016-addaxis
- https://www.mathworks.com/matlabcentral/fileexchange/1017-plotyyy
Or adapt this demo to your needs (yyaxis requires r2016a or later)
Setting up two y axes is trivial. Three y axes, not so trivial. You'll need to set up a plot with and right and left y axes (using yyaxis) and then you'll need to overlay invisible axes on top of the original ones, perfectly placed, and perfectly scaled so the vertical and horizontal ticks align. Finally, add some space to the right of the y tick labels so they are horizontally offset.
Here's a demo that you can adapt to your needs. The critical steps are setting the axis ticks and making sure the spacing is the same between axes. I use the grid feature for both axes to ensure that they are overlayed property (otherwise you'll see double grids).
% Create some data to work with
x = 0:.1:3;
y1 = exp(x);
y2 = log(x);
y3 = x.^2;
% Plot on the left and right y axes
figure
ax1 = axes;
yyaxis left % see [1]
plot(x,y1)
pause(0.1) % see [3]
% set the y(left) and x tick values, make them permanent
% This is the tricky part and shoudl receive a lot of thought when
% you adapt this to your code...
ax1.XTickMode = 'manual';
ax1.YTickMode = 'manual';
ax1.YLim = [min(ax1.YTick), max(ax1.YTick)]; % see [4]
ax1.XLimMode = 'manual';
grid(ax1,'on')
ytick = ax1.YTick;
yyaxis right % see [1]
plot(x,y2)
% create 2nd, transparent axes
ax2 = axes('position', ax1.Position);
plot(ax2,x,y3, 'k')
pause(0.1) % see [3]
ax2.Color = 'none';
grid(ax2, 'on')
% Horizontally scale the y axis to alight the grid (again, be careful!)
ax2.XLim = ax1.XLim;
ax2.XTick = ax1.XTick;
ax2.YLimMode = 'manual';
yl = ax2.YLim;
ax2.YTick = linspace(yl(1), yl(2), length(ytick)); % see [2]
% horzontally offset y tick labels
ax2.YTickLabel = strcat(ax2.YTickLabel, {' '});
% [1] https://www.mathworks.com/help/matlab/ref/yyaxis.html
% [2] this is the critical step to align the grids. It assumes both
% axes contain ticks at the start and end of the y axis
% [3] For some reason when I step through the code, the plots appear
% as they should but when I run the code at it's natural speed
% there are graphics issues. It's as if code execution is
% ahead of the graphics which is annoying. A brief pause
% fixes this (r2019a)
% [4] Scaling is easier if the ticks begin and end at the axis limits

Changes needed to create the double y-axis on the right side instead of the left side
- Calculate ytick = ax1.YTick after plotting on the right axis.
- After creating ax2, set the y axis location to the right side using ax2.YAxisLocation = 'right';
- Pad the left side of the ax2 y-axis ytick lables instead of the right side by changing: ax2.YTickLabel = strcat({' '},ax2.YTickLabel);
For matlab releases prior to 2016a, use plotyy() instead
The code above has been adapted to plotyy().
% Create some data to work with
x = 0:.1:3;
y1 = exp(x);
y2 = log(x);
y3 = x.^2;
% create the first axes with the two y axes
figure
yyh = plotyy(x,y1,x,y2); %see [1]
yyh(1).XTickMode = 'manual';
yyh(1).YTickMode = 'manual';
yyh(1).YLim = [min(yyh(1).YTick), max(yyh(1).YTick)]; % see [4]
yyh(1).XLimMode = 'manual';
grid(yyh(1),'on')
ytick = yyh(1).YTick;
% create 2nd, transparent axes
ax2 = axes('position', yyh(1).Position);
plot(ax2,x,y3, 'k')
pause(0.1) % see [3]
ax2.Color = 'none';
grid(ax2, 'on')
% Horizontally scale the y axis to alight the grid (again, be careful!)
ax2.XLim = yyh(1).XLim;
ax2.XTick = yyh(1).XTick;
ax2.YLimMode = 'manual';
yl = ax2.YLim;
ax2.YTick = linspace(yl(1), yl(2), length(ytick)); % see [2]
% horzontally offset y tick labels
ax2.YTickLabel = strcat(ax2.YTickLabel, {' '});
% [1] https://www.mathworks.com/help/matlab/ref/plotyy.html
% [2] this is the critical step to align the grids. It assumes both
% axes contain ticks at the start and end of the y axis
% [3] For some reason when I step through the code, the plots appear
% as they should but when I run the code at it's natural speed
% there are graphics issues. It's as if code execution is
% ahead of the graphics which is annoying. A brief pause
% fixes this (r2019a)
% [4] Scaling is easier if the ticks begin and end at the axis limits
15 件のコメント
Umang Dongre
2019 年 5 月 6 日
Thank you, for responding on my question :) sir i tried your answer but not getting it properly.
Sir,
I'm sending you "A0006.mat" file, Will you please help me to plot that data into 3 - y axes.
Thanks in advance.
Your zip files doesn't contain your code. You'll need to provide the section of code that does your plotting.
Umang Dongre
2019 年 5 月 8 日
編集済み: Umang Dongre
2019 年 5 月 8 日
Code -
VarName1=A0006(:,1); % Voltage
VarName2=A0006(:,2); % Current
VarName3=A0006(:,3)/3600; % Time
VarName4=A0006(:,4); % SOC
plot(VarName3, VarName1, VarName3, VarName2, VarName3, VarName4);
I want to plot this voltage, current and SOC with respect to Time, And in my data set A0006.mat there are 4 colomns 1st-voltage, 2nd-current, 3rd-time, 4th-SOC
Your "x" variable is VarName3. The other 3 variables are your 'y' values. Now you just need to apply that to my method.
x = A0006(:,3)/3600;
y1 = A0006(:,1);
y2 = A0006(:,2);
y3 = A0006(:,4);
% and the rest of the code in my answer.
If you have any other difficulties you'll need to share your version of the code and describe why it's not working.
Umang Dongre
2019 年 5 月 10 日
yes I did but it shows error
Undefined function 'yyaxis' for input arguments of type 'char'.
Error in OCV_SOC (line 7)
yyaxis left
and in figure window it does not showing anything.
code:
y2=A0006(:,1);
y1=A0006(:,2);
x=A0006(:,3)/3600;
y3=A0006(:,4);
figure
ax1 = axes;
yyaxis left
plot(x,y1)
pause(0.1)
ax1.XTickMode = 'manual';
ax1.YTickMode = 'manual';
ax1.YLim = [min(ax1.YTick), max(ax1.YTick)];
ax1.XLimMode = 'manual';
grid(ax1,'on')
ytick = ax1.YTick;
yyaxis right
plot(x,y2)
ax2 = axes('position', ax1.Position);
plot(ax2,x,y3, 'k')
pause(0.1)
ax2.Color = 'none';
grid(ax2, 'on')
ax2.XLim = ax1.XLim;
ax2.XTick = ax1.XTick;
ax2.YLimMode = 'manual';
yl = ax2.YLim;
ax2.YTick = linspace(yl(1), yl(2), length(ytick));
ax2.YTickLabel = strcat(ax2.YTickLabel, {' '});
Adam Danz
2019 年 5 月 10 日
Umang Dongre
2019 年 5 月 20 日
yes please ... I am using r2014a that's why it doesn't working.
Adam Danz
2019 年 5 月 20 日
Ok, scroll down and see the 2nd half of my answer for a plotyy() example.
Umang Dongre
2019 年 5 月 21 日
Ok, so output has came like this i want that blue curve i.e. data "y1" little lower than green one.

and "y3" hasn't plot. one error occured
Structure assignment to non-structure object.
Error in OCV_SOC (line 8)
yyh(1).XTickMode = 'manual';
and data of "x" is changing after code runs.
Adam Danz
2019 年 5 月 21 日
So use ylim() to scale the left y-axis so your blue curve is lower in the axis.
Perhaps the XTickMode property hasn't been released yet in whatever matlab release you're using. Try replacing it with (not tested):
set(yyh(1), 'XTick', get(yyh(1), 'XTick'))
Note that this property is set in several lines of my code so you'll need to make that change a few times.
Umang Dongre
2019 年 5 月 27 日
Ok
y2=A0006(:,1);
y1=A0006(:,2);
x=A0006(:,3)/3600;
y3=A0006(:,4);
% create the first axes with the two y axes
figure
yyh = plotyy(x,y1,x,y2); %see [1]
ylim([-1 5])
set(yyh(1), 'XTick', get(yyh(1), 'XTick'))
set(yyh(1), 'YTick', get(yyh(1), 'YTick'))
% yyh(1).XTickMode = 'manual';
% yyh(1).YTickMode = 'manual';
yyh(1).YLim = [min(yyh(1).YTick), max(yyh(1).YTick)]; % see [4]
yyh(1).XLimMode = 'manual';
grid(yyh(1),'on')
ytick = yyh(1).YTick;
% create 2nd, transparent axes
ax2 = axes('position', yyh(1).Position);
plot(ax2,x,y3, 'k')
pause(0.1) % see [3]
ax2.Color = 'none';
grid(ax2, 'on')
% Horizontally scale the y axis to alight the grid (again, be careful!)
ax2.XLim = yyh(1).XLim;
ax2.XTick = yyh(1).XTick;
ax2.YLimMode = 'manual';
yl = ax2.YLim;
ax2.YTick = linspace(yl(1), yl(2), length(ytick)); % see [2]
% horzontally offset y tick labels
ax2.YTickLabel = strcat(ax2.YTickLabel, {' '});
1 error is occuring
Improper index matrix reference.
Error in OCV_SOC (line 13)
yyh(1).YLim = [min(yyh(1).YTick), max(yyh(1).YTick)]; % see [4]
and sir what about "y3" data it is not getting plot.
Adam Danz
2019 年 5 月 28 日
Have you looked into the error at all? Have you tried to understand what's wrong? What is the value of yyh(1)? Is that causing the error? Is yyh empty? If yyh(1) does not cause an error, does yyh(1).YTick cause an error? I don't have values for A0006 so I cannot run your code.
Sarah Poole
2022 年 2 月 11 日
thank you, this demo works great even on R2021a. :)
Adam Danz
2022 年 2 月 11 日
Rik
2022 年 3 月 14 日
the simplest answer i have found
その他の回答 (0 件)
カテゴリ
ヘルプ センター および File Exchange で Two y-axis についてさらに検索
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
