y-axis with diffent scalings

12 次查看(过去 30 天)
dj1du
dj1du 2023-6-4
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?

回答(2 个)

chicken vector
chicken vector 2023-6-4
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 2023-6-4
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');

类别

Help CenterFile Exchange 中查找有关 Graphics 的更多信息

标签

Community Treasure Hunt

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

Start Hunting!

Translated by