How to set upper x-axis ticks values and locations?

23 Ansichten (letzte 30 Tage)
Andrea Improta
Andrea Improta am 24 Jun. 2024
Bearbeitet: Andrea Improta am 24 Jun. 2024
I am trying to set the upper x-axis (ax2) tick values and locations:
x_a = linspace(71.8131,36.9931,10);
y = linspace(0.16,1,10);
x_b = linspace(0.0163,0.0069,10)./0.1016;
figure;
ax1 = axes;
plot(ax1, x_a, y, 'k');
ax2 = axes('Position', ax1.Position, ...
'XAxisLocation', 'top', ...
'YAxisLocation', 'right', ...
'Color', 'none', ...
'XColor', '#88419d', ...
'YColor', 'none', ...
'Box', 'off');
ax2.YLim = ax1.YLim;
new_tick_locations = linspace(30, 80, 6);
new_tick_labels = arrayfun(@(val) sprintf('%.2f', val/500), new_tick_locations, 'UniformOutput', false);
set(ax2, 'XTick', new_tick_locations, 'XTickLabel', new_tick_labels);
% linkaxes([ax1 ax2], 'xy');
hold(ax2, 'on');
plot(ax2, x_b, y, 'r');
This code doesn't show the ax2 ticks at all. I need them to show and to be aligned with the lower x axis labels [30, 40, 50, 60, 70, 80]. How can I fix this? Thank you in advance.

Akzeptierte Antwort

Aquatris
Aquatris am 24 Jun. 2024
Bearbeitet: Aquatris am 24 Jun. 2024
You were changing the label name at 30 60, instead of their actual values, so here is one dirty way but I recommend you follow the tilegraph method exaplined here for cleaner and better plot:
x_a = linspace(71.8131,36.9931,10);
y = linspace(0.16,1,10);
x_b = linspace(0.0163,0.0069,10)./0.1016;
figure;
ax1 = axes;
plot(ax1, x_a, y, 'k');
ax2 = axes('Position', ax1.Position, ...
'XAxisLocation', 'top', ...
'YAxisLocation', 'right', ...
'Color', 'none', ...
'XColor', '#88419d', ...
'YColor', 'none', ...
'Box', 'off');
ax2.YLim = ax1.YLim;
new_tick_locations = linspace(30, 80, 6);
new_tick_labels = arrayfun(@(val) sprintf('%.2f', val/500), new_tick_locations, 'UniformOutput', false);
set(ax2, 'XTick', new_tick_locations/500, 'XTickLabel', new_tick_labels);
% linkaxes([ax1 ax2], 'xy');
hold(ax2, 'on');
plot(ax2, x_b, y, 'r');
ax1.Box = 'off';
ax2.XLim = new_tick_locations([1 end])/500;
  3 Kommentare
Aquatris
Aquatris am 24 Jun. 2024
Bearbeitet: Aquatris am 24 Jun. 2024
Then you can set the xlims to define their minimum and maximum positions:
x_a = linspace(71.8131,36.9931,10);
y = linspace(0.16,1,10);
x_b = linspace(0.0163,0.0069,10)./0.1016;
figure;
ax1 = axes;
plot(ax1, x_a, y, 'k');
ax2 = axes('Position', ax1.Position, ...
'XAxisLocation', 'top', ...
'YAxisLocation', 'right', ...
'Color', 'none', ...
'XColor', '#88419d', ...
'YColor', 'none', ...
'Box', 'off');
ax2.YLim = ax1.YLim;
new_tick_locations = linspace(30, 80, 6);
new_tick_labels = arrayfun(@(val) sprintf('%.2f', val/500), new_tick_locations, 'UniformOutput', false);
set(ax2, 'XTick', new_tick_locations/500, 'XTickLabel', new_tick_labels);
% linkaxes([ax1 ax2], 'xy');
hold(ax2, 'on');
plot(ax2, x_b, y, 'r');
ax1.Box = 'off';
%% to make sure 30 aligns with 0.06 and 80 aligns with 0.16
ax1.XLim = [30 80];
ax2.XLim = [0.06 0.16];

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Pavan Sahith
Pavan Sahith am 24 Jun. 2024
Bearbeitet: Pavan Sahith am 24 Jun. 2024
Hello Andrea,
I see that you are facing an issue with the new_tick_locations you are setting for ax2. The new_tick_locations should be within the range of ax2.XLim, which is inherited from ax1.XLim when ax2 is created.
I can see that new_tick_locations you provided (30 to 80) do not match the range of x_b values.To fix this, you need to set the XTick values for ax2 within the range of x_b. you can refer to this sample code:
x_a = linspace(71.8131, 36.9931, 10);
y = linspace(0.16, 1, 10);
x_b = linspace(0.0163, 0.0069, 10) ./ 0.1016;
figure;
ax1 = axes;
plot(ax1, x_a, y, 'k');
ax2 = axes('Position', ax1.Position, ...
'XAxisLocation', 'top', ...
'YAxisLocation', 'right', ...
'Color', 'none', ...
'XColor', '#88419d', ...
'YColor', 'none', ...
'Box', 'off');
ax2.YLim = ax1.YLim;
ax2.XLim = [min(x_b), max(x_b)]; % Set XLim for ax2 to match the range of x_b
% Set new tick locations and labels within the range of x_b
new_tick_locations = linspace(min(x_b), max(x_b), 6);
new_tick_labels = arrayfun(@(val) sprintf('%.2f', val), new_tick_locations, 'UniformOutput', false);
set(ax2, 'XTick', new_tick_locations, 'XTickLabel', new_tick_labels);
hold(ax2, 'on');
plot(ax2, x_b, y, 'r');
following similar adjustments, the ticks for ax2 can be displayed correctly.
you can go through this MathWorks documentation which will help you understand better
you can aslo refer to this similar MATLAB answer which might help
Hope this helps you moving forward
  1 Kommentar
Andrea Improta
Andrea Improta am 24 Jun. 2024
Hi, thanks for your answer. I was thinking that your solution replaces the ticks that used to be at the locations
new_tick_locations = linspace(min(x_b), max(x_b), 6);
with some new tick values (new_tick_labels). Am I wrong?

Melden Sie sich an, um zu kommentieren.

Tags

Produkte


Version

R2023b

Community Treasure Hunt

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

Start Hunting!

Translated by