2017-08-31 44 views
1

我想在Matlab的简单情节的,说Matlab的情节有部分指数或对数刻度取决于y值

% 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

您可以创建两个次要情节和,但他们在一起

% 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

谢谢!它工作正常,但我想我同意它看起来很混乱;)所以我会用2个地块,而不是正常的规模,一个与日志规模。现在我知道如何用日期做半日志,我唯一的问题是:“不显示负值”。你有什么建议? – LenaH

1

当阴谋(X),你是精确绘制是:

plot(1:length(x),x) 

所以让我们说,你有另一种载体:

t= 1:length(x) 

现在你可以操纵这个载体得到任何缩放以你横轴为例:

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

然后如果你绘制(t,x),你将有第一个1 0个元素以指数规模绘制!

+0

不幸的是它更复杂,因为我的矢量是日期...我编辑了上面的问题,使其更加精确。 – LenaH