根据y值,具有部分指数或对数标度的Matlab图

时间:2017-08-31 08:27:56

标签: matlab plot matlab-figure

我想在Matlab中制作一个简单的情节,比如说

% data:
x = -9:8;
% dates:
Y = [];
for year = 2008:2016
    Y = vertcat(Y,[year;year]);
end
M = repmat([01;06],9,1);
D = [01];
vector = datetime(Y,M,D);

plot(vector, x);
dateaxis('x', 12);

现在我想要x的所有值的对数刻度

x<0

的指数刻度
x>0

但是该图的其他部分的正常比例。原因是负值变得如此之低,以正常比例显示正值似乎全为零。我查看了帮助,但是semilog功能等对我没有帮助。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

你可以创建两个子图,但是它们可以一起创建

% plotting
figure;
p1 = subplot(2,1,1);
idx = x>=0; plot(vector(idx), x(idx));
p2 = subplot(2,1,2);
idx = x<=0; plot(vector(idx), x(idx));
% Make x-axis limits the same (must use datenum)
lims = datenum([min(vector), max(vector)]);
xlim(p1, lims); xlim(p2, lims);
% Make the plots meet in the middle
h = 0.45; w = 0.9; % height and width
set(p1, 'position', [(1-w)/2, 0.5, w, h])
set(p2, 'position', [(1-w)/2, 0.5-h, w, h])
% Ensure the y axes meet at 0
ylim(p1, [0, max(x)]); ylim(p2, [min(x), 0]);

无论你喜欢什么,都可以完成两个单独的情节。因此,如果您使用相关方法绘制它们,您将获得一个具有指数y轴和一个具有log y轴的方法。

您可以使用

代替上面的plot(...)
% log y plot
semilogy(datenum(vector(idx)), x(idx))

请注意,此输出完全按预期工作,但您尝试执行的实际情节听起来非常混乱。如果轴确实想要不同,那么在大多数情况下将它呈现为两个单独的图可能会更好。在这种情况下,请使用上面的代码而不使用position行!

在搞乱情节类型之前,这就是输出的样子,0线上方和下方的y轴是完全独立的,因为这实际上是2个图:

plot

答案 1 :(得分:1)

当您绘制(x)时,您正在绘制的是:

plot(1:length(x),x) 

所以我们假设你有另一个向量:

t= 1:length(x)

现在您可以操纵此向量以在水平轴上进行任何缩放,例如:

t(1:10) = exp(-t(1:10));

然后如果你绘制(t,x),你将有前10个元素以指数标度绘制!