y-axis with diffent scalings

10 vues (au cours des 30 derniers jours)
dj1du
dj1du le 4 Juin 2023
Commenté : chicken vector le 4 Juin 2023
Hello,
in the attached figure I'd like to make the y values between 0 and 0.05 (dashed line) appear more clearly visible, as a lot of values are located in this range. Basically, I'd like the y axis to be scaled between 0 and 0.05 in steps of 0.01 and the scaling of all values > 0.05 should be like in the attached figure. How can I do this?

Réponses (2)

chicken vector
chicken vector le 4 Juin 2023
If you want to keep the figure with this format, I'd say you have two options.
You can either make an axis break with the FEX functions mentioned here:
Or you change the scale of Y-axis to the only non-linear option avilable:
x = repmat(1 : .5 : 6, 1, 4);
data = rand(size(x)) * 10;
idx = data > 5;
data(idx) = .5 + rand(size(find(idx))) / 3;
figure;
tiledlayout(2, 1);
nexttile;
scatter(x, data);
nexttile;
scatter(x, data);
set(gca, 'YScale', 'Log');

Simon Chan
Simon Chan le 4 Juin 2023
Let's try use function yyaxis.
Separate the data into two groups and plot the larger and smaller values using left and right y-axis respectively.
Adjust the y-axis scale on both sides and finally hide the right y-axis.
Agree that it is a bit complicated but final result is similar to what you need.
x = 1:0.5:6;
y = [rand(4,numel(x))*0.05; rand(4,numel(x))];
threshold = 0.05;
idx = y>threshold;
ylarge = y.*idx;
ylarge(~idx) = NaN;
ysmall = y.*~idx;
ysmall(idx) = NaN;
% 5 steps from 0 to 0.05 & 19 steps from 0.05 to 1.0
nLevel_large = (1.0-threshold)/threshold;
nLevel_small = (threshold-0)/0.01;
nLevel = nLevel_large + nLevel_small;
ystart_large = 1 - nLevel*threshold;
yend_small = 0.01*nLevel;
f = figure;
ax1= axes(f);
yyaxis(ax1,'left')
yline(ax1,threshold,'-.')
marker = ["s","*","o","d","s","*","o","d"];
color = ["r","b","g","m","m","g","b","r"];
arrayfun(@(r) line(x,ylarge(r,:),'LineStyle','none','Marker',marker(r),'Color',color(r)),1:8,'uni',0);
ax1.YLim = [ystart_large 1];
ax1.YTick= ystart_large:threshold:1.0;
ax1.YTickLabel = [compose('%.2f',0:0.01:0.04),compose('%.2f',threshold:threshold:1.00)];
yyaxis(ax1,'right');
arrayfun(@(r) line(x,ysmall(r,:),'LineStyle','none','Marker',marker(r),'Color',color(r)),1:8,'uni',0);
ax1.YLim = [0 yend_small];
ax1.YAxis(2).Visible='off';
grid(ax1,'on');
  1 commentaire
chicken vector
chicken vector le 4 Juin 2023
Very nice.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Graphics dans Help Center et File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by