Effacer les filtres
Effacer les filtres

How can I plot a figure with 3 y-axis and and common logarithmic x-axis?

52 vues (au cours des 30 derniers jours)
In short I have three different graphs that I need to plot to the same figure but with 3 different y-axis. Inbuilt plotyy.m plots two y-axis just fine and multiplotyyy.m for example handles three y-axis well. Problem however araises when I try to get these functions to work with logaritmic x-axis. How can this be done?

Réponse acceptée

Hassaan
Hassaan le 8 Jan 2024
% Sample data
x = logspace(0, 2, 100); % Logarithmic x-axis data
y1 = sin(x);
y2 = cos(x);
y3 = exp(0.05 * x);
% Ensure y1 is positive and non-zero for the loglog plot
y1_positive = abs(y1) + 1e-6; % Adding a small constant to avoid log of zero
% Create figure
figure;
% Plot the first dataset with a logarithmic x-axis
yyaxis left;
loglog(x, y1_positive, 'b-', 'LineWidth', 1); % Use 'loglog' for logarithmic x and y axes
ylabel('Left Y-axis (sin(x))');
% Add a second y-axis on the right and plot the second dataset
yyaxis right;
semilogx(x, y2, 'r-', 'LineWidth', 1); % Use 'semilogx' for logarithmic x-axis only
ylabel('Right Y-axis 1 (cos(x))');
% Manually create a third y-axis
ax1 = gca; % Current axes
ax2 = axes('Position', ax1.Position, ...
'XAxisLocation', 'top', ...
'YAxisLocation', 'right', ...
'Color', 'none', ...
'XColor', 'k', 'YColor', 'm', ...
'XScale', 'log', ... % Set x-axis to logarithmic scale
'YTick', [], ... % Hide y-ticks on the third axis
'XTick', []); % Hide x-ticks on the third axis
linkaxes([ax1, ax2], 'x'); % Link the x-axes
% Plot the third dataset on the third y-axis
line(x, y3, 'Parent', ax2, 'Color', 'm', 'LineWidth', 1);
ylabel(ax2, 'Right Y-axis 2 (exp(0.05x))');
% Label the shared x-axis
xlabel('Logarithmic X-axis');
% Ensure the plot box is on and grid is visible
box on;
grid on;
% Set the limits of the x-axis (optional)
xlim([min(x), max(x)]);
% Add a title and a grid
title('Multi-axis Plot with Logarithmic X-axis');
grid on;
  • y1 (sin(x)) on the left y-axis using a loglog plot (logarithmic in both x and y). Negative values are handled by taking the absolute value and adding a small offset to avoid the logarithm of zero.
  • y2 (cos(x)) on the right y-axis using a semilogx plot (logarithmic in x only).
  • y3 (exp(0.05 * x)) on an additional manually created right y-axis also using a logarithmic x-axis.
Remember to replace the y1, y2, and y3 datasets with your actual data. Adjust the xlim and other plot settings as needed to suit your specific requirements.
------------------------------------------------------------------------------------------------------------------------------------------------
If you find the solution helpful and it resolves your issue, it would be greatly appreciated if you could accept the answer. Also, leaving an upvote and a comment are also wonderful ways to provide feedback.
Professional Interests
  • Technical Services and Consulting
  • Embedded Systems | Firmware Developement | Simulations
  • Electrical and Electronics Engineering

Plus de réponses (1)

Ayush
Ayush le 8 Jan 2024
Modifié(e) : Ayush le 8 Jan 2024
My understanding of your question is that you need 3-axes and x-axis in log scale. Here is the conceptual code for that:
% Example data
x = logspace(-1, 1, 100); % Logarithmic x-axis data
y1 = sin(x);
y2 = cos(x);
y3 = exp(x);
% Create the first two y-axes using plotyy
[ax, h1, h2] = plotyy(x, y1, x, y2, 'semilogx');
% Set properties of the first two axes
set(ax(1), 'XScale', 'log', 'XColor', 'k', 'YColor', 'b');
set(ax(2), 'XScale', 'log', 'XColor', 'k', 'YColor', 'r');
ylabel(ax(1), 'First Y-axis');
ylabel(ax(2), 'Second Y-axis');
% Add the third axis
ax3 = axes('Position', ax(2).Position, 'XAxisLocation', 'top', 'YAxisLocation', 'right', 'Color', 'none', 'XColor', 'k', 'YColor', 'g');
linkaxes([ax(1), ax3], 'x'); % Link the x-axes
% Offset the third axis from the second
offset = 1; % Adjust this value as needed
ax3_pos = get(ax3, 'Position');
set(ax3, 'Position', [ax3_pos(1)+ax3_pos(3)*offset ax3_pos(2) ax3_pos(3)*(1-offset) ax3_pos(4)]);
set(ax3, 'box', 'off'); % Turn off the box to avoid drawing the top spine
% Plot the third data set on the third axis
h3 = line(x, y3, 'Color', 'g', 'Parent', ax3);
ylabel(ax3, 'Third Y-axis');
set(ax3, 'XScale', 'log', 'YAxisLocation', 'right', 'XTick', []);
% Adjust the axes limits if necessary
set(ax3, 'YLim', [min(y3), max(y3)]);
set(ax3, 'XLim', get(ax(1), 'XLim')); % Ensure the x-axis limits match
% Add legends
legend([h1, h2, h3], {'Data1', 'Data2', 'Data3'});
Thanks,
Ayush

Tags

Produits


Version

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by