Plotting Chart With 2 X Axes and 2 Y Axes

4 ビュー (過去 30 日間)
Brian Robinson
Brian Robinson 2020 年 5 月 26 日
回答済み: Brian Robinson 2020 年 5 月 29 日
Hi there,
I am trying to plot various curves using semilogx along with the line of best fit. I also want to plot some other plots of semilogx on different axes (but in the same figure). I have:
ARI = ones(n,1)./P; % Average Return Interval 1/P
semilogx((ARI), Q);
p_1 = polyfit(log(ARI),Q,1); % Linear best fit
f_1 = polyval(p_1,log(ARI));
hold on
ax1 = gca; % Axis for Linear Fit
ax1.XColor = 'r';
ax1.YColor = 'r';
ax1_pos = ax1.Position; % Position of first axes
ax2 = axes('Position', ax1_pos, 'XAxisLocation','top','YAxisLocation',"right",'Color', 'none'); % Create the second axis
semilogx(ARI, f_1, '--r');
Q_100yr = polyval(p_1, log(100)) % Q value for 1 in 100 year
hold off
For some reason when I try to create the second axis, the position of the axis is not as I would like and I lose my original log curve. It ends up looking like this:
Could someone help me to get the 2 axes working.
Thanks in advance,
Brian

採用された回答

Adam Danz
Adam Danz 2020 年 5 月 26 日
編集済み: Adam Danz 2020 年 5 月 26 日
In the example plot provided in the question, the x axis is the same for both pairs of axes. To use a left and right axes with the same x axis, se yyaxis.
ARI = ones(n,1)./P; % Average Return Interval 1/P
yyaxis left
semilogx((ARI), Q);
yyaxis right
p_1 = polyfit(log(ARI),Q,1); % Linear best fit
f_1 = polyval(p_1,log(ARI));
semilogx(ARI, f_1, '--r');
Q_100yr = polyval(p_1, log(100)) % Q value for 1 in 100 year
  6 件のコメント
Brian Robinson
Brian Robinson 2020 年 5 月 28 日
Ok well regarding the formatting of the axes. I didn't really want to add more ticks but rather to just change the formatting so that 10^0 would read 1 etc and perhaps just add a few numbers in between where there are existing ticks so we could have 1, 5, 10.
If this is too complex then I won't worry because its not that important.
Thanks,
Brian
Adam Danz
Adam Danz 2020 年 5 月 28 日
I'm assuming you want to maintain the log scale. Otherwise, you could just use plot instead of semilogx. Or,
ax = gca();
ax.XScale = 'linear'; % = 'log' to switch back to log scale
Here's how to change the x tick format from exponential to their log10 values.
ax.XTick = ax.XTick; % important to set the xtick first
ax.XTickLabel = cellstr(num2str(ax.XTick'));
Here's how to specify the number of ticks along the x axis in log space. Note that the ticks here are rounded to the nearest 10th but you can adapt as needed. The first line below produces 6 tics spanning the range of the x axis.
xl = xlim(ax); % xlim cannot contain 0, of course.
newTicks = logspace(log10(xl(1)), log10(xl(2)), 6);
ax.XTick = newTicks;
ax.XTickLabel = cellstr(sprintf('%.1f\n',ax.XTick));
ax.XMinorTick = 'off'; %Turn off minor ticks

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

その他の回答 (1 件)

Brian Robinson
Brian Robinson 2020 年 5 月 29 日
Hi Adam,
I have following code to calculate the expected Q value for 100yr event.
ARI_Weibull = ones(n,1)./P_Weibull;% Average Return Interval 1/P
figure
semilogx((ARI_Weibull), Q, 'r');
p_1 = polyfit(log(ARI_Weibull),Q,1); % Linear best fit
f_1 = polyval(p_1,log(ARI_Weibull));
hold on
% ax1 = gca; % Axis for Linear Fit
% ax1.XColor = 'r';
% ax1.YColor = 'r';
% ax1_pos = ax1.Position; % Position of first axes
semilogx(ARI_Weibull,f_1,'--r');
Q_100yr = polyval(p_1, log(100)) % Q value for 1 in 100 year
xline(log(100)) ;
hold off
For the Q_100yr we get 1.1042e4. Then I thought when I plot xline(log(100)) this would correspond to that Q value on the line of best fit but it doesn't. Do you know where I'm going wrong?

カテゴリ

Help Center および File ExchangeLog Plots についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by