Matlab中的正负对数10刻度Y轴

4

您好,我遇到了一个问题,我的数据集范围在-10^3到10^3之间。

我需要以对数刻度绘制此数据,但是semilogy无法绘制负值。

例如,我的数据如下:

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

(或者一般情况下使用y=sign(x).*10.^abs(x);

如何在MATLAB中使用对数刻度绘制此图形?如果可能的话,最好是对数刻度刻度线也在Y轴上。


对于log(x),x不能小于0。 - NKN
@NKN 我很清楚,但我正在计算两个变量之间的对数差,这些变量的范围在0到1000之间。一般来说,差异是正的,但我需要能够绘制它不是的时间。 - Eduardo
如果它们是两个正变量,那么为什么不把它们叠在一起绘制呢? - NKN
2
你必须决定如何处理你的值,使它们都变成正数(加上10^3?)。否则就不要考虑对数。 - Luis Mendo
4个回答

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值?

以下函数(感谢gnovice)将返回您可以选择的所有可能值,用于N

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

关于semilogy样式标签:在绘制图表之前添加以下行:

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

你至少可以实现类似这样的东西: 输入图像描述 不太漂亮也不太常见,但对于你来说是一个好的起点。

有没有办法获取 semilogy 显示的对数刻度标记? - Eduardo
1
不行,因为这不是semilogy的作用。负数的对数在实数范围内是没有定义的。你想要的在数学上是不一致的,这就是为什么需要“YTick(isnan(YTick)) = 0;”。 - Robert Seifert
实际上,这是有可能的。你可以在我的最后一次编辑中找到一个初始想法。 - Robert Seifert

1
你不能制作一条穿过零点的对数轴,因为这没有意义!由于对数刻度通常显示为例如100-10-1-1/10-1/100-...,所以你需要无限的空间才能让轴穿过零点。

0

@thewaywewalk已经提供了一个很好的解决方案。我建议的是在此基础上进行微小改进。如果您进行两个更改: (a) 定义一个新的MATLAB函数signia,它基本上提取数字前面的符号。

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轴刻度显示的改进。我得到了以下内容。 输入图像描述

0
这样怎么样:
x=logspace(-3,3);
y=sign(x).*10.^abs(x);
loglog(x,y)

enter image description here


10^-3 不等于 -10^3 - shkristensen
@shkristensen 我没有使用 y = [-1000,-100,-10,1,10,100,1000];我使用的是她想要绘制的通用公式。当然,我知道 10^-3 不是 -10^3。 - NKN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接