Plotting Chart With 2 X Axes and 2 Y Axes

3 Ansichten (letzte 30 Tage)
Brian Robinson
Brian Robinson am 26 Mai 2020
Beantwortet: Brian Robinson am 29 Mai 2020
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

Akzeptierte Antwort

Adam Danz
Adam Danz am 26 Mai 2020
Bearbeitet: Adam Danz am 26 Mai 2020
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 Kommentare
Brian Robinson
Brian Robinson am 28 Mai 2020
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 am 28 Mai 2020
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

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Brian Robinson
Brian Robinson am 29 Mai 2020
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?

Kategorien

Mehr zu Log Plots finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by