积极的& Matlab中的负Log10标度Y轴

时间:2014-01-09 17:35:41

标签: matlab plot

嗨我遇到的问题是我的数据集范围在-10 ^ 3到10 ^ 3之间

我需要能够将其绘制为对数刻度,但半月期不能绘制负值

比方说我的数据是:

x = [-3,-2,-1,0,1,2,3];
y = [-1000,-100,-10,1,10,100,1000];

(或一般y=sign(x).*10.^abs(x);

如何在MATLAB中用对数刻度绘制?如果可能的话,如果对数刻度也可以在Y轴上,那将是很好的

4 个答案:

答案 0 :(得分:4)

将您的实际数据用作标签,但使用log10缩放绘制的数据。

% data
x = -3:0.1:3;
y = sign(x).*10.^abs(x);

% scaling function
scale = @(x) sign(x).*log10(abs(x));

N = 7;    % number of ticks desired

% picking of adequate values for the labels
TickMask = linspace(1,numel(y),N);
YTickLabels = y(TickMask);

% scale labels and plotdata, remove NaN ->inconsistency, do you really want that?
YTick = scale( YTickLabels );
Y = scale(y);

YTick(isnan(YTick)) = 0;
Y(isnan(Y)) = 0;

% plot
plot(x,Y)
set(gca,'YTick',YTick,'YTickLabels',YTickLabels)
grid on

N = 7

enter image description here

N = 11

enter image description here


如何查找N的有效值?

以下函数(thanks to gnovice)将返回您为N选择的所有可能值:

n = numel(x);
N = find(rem(n./(1:n), 1) == 0) + 1;

关于半学院风格的标签:在剧情前加上以下一行:

YTickLabels = cellfun(@(x) ['10^' num2str(x)], num2cell(YTick),'UniformOutput',false)

你至少可以达到以下目的: enter image description here 不是很漂亮而不是通用,但对你来说是个好点。

答案 1 :(得分:1)

你不能使对数轴过零的原因是它没有意义! 由于对数标度通常显示为例如。 100 - 10 - 1 - 1/10 - 1/100 - ...,你需要一个无限的空间来使轴交叉为零。

答案 2 :(得分:0)

这个怎么样:

x=logspace(-3,3);
y=sign(x).*10.^abs(x);
loglog(x,y)

enter image description here

答案 3 :(得分:0)

@thewaywewalk已经提供了一个漂亮的解决方案。我建议的是对它的epsilon改进。如果您进行两项更改 (a)定义一个新的MATLAB函数信号,该信号基本上从数字前提取符号。

function value = signia(x)
if(x>=0)
    value = '';
else
    value = '-';
end

和(b)进行了这一小的更改,而不是

YTickLabels = cellfun(@(x) ['10^' num2str(x)], num2cell(YTick),'UniformOutput',false)

您使用

YTickLabels = cellfun(@(x) [signia(x) '10^{' num2str(x) '}'], num2cell(YTick),'UniformOutput',false);

(注意花括号的存在),您将在Y刻度显示中得到改善。我得到以下。 enter image description here