【问题标题】:Positive & Negitive Log10 Scale Y axis in MatlabMatlab中的正负Log10缩放Y轴
【发布时间】:2014-01-09 17:35:41
【问题描述】:

您好,我遇到了一个问题,我的数据集范围在 -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 轴上,那就太好了

【问题讨论】:

  • 对于log(x),x不能小于0。
  • @NKN 我很清楚,但我正在计算两个变量之间差异的对数,范围在 0 到 1000 之间。一般来说差异是正的,但我需要能够绘制它的时间不是。
  • 如果它们是两个正变量,那你为什么不把它们放在一起呢?
  • 你必须决定如何对你的价值观做些什么来让它们都变得积极(给它们加 10^3?)。否则忘记日志

标签: matlab plot


【解决方案1】:

使用您的实际数据作为标签,但使用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

对于N = 11


如何找到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)

你至少可以实现这样的目标: 不漂亮也不通用,但对你来说是一个很好的起点。

【讨论】:

  • 无论如何都可以得到符号学显示的对数刻度标记?
  • 不,因为符号学不是这样做的。未定义负值的对数(对于实数)。你想要的在数学上是不一致的,这就是为什么需要YTick(isnan(YTick)) = 0;
  • 实际上,这是有可能的。第一个想法,你可以找到我最后的编辑。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这个怎么样:

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

    【讨论】:

    • 10^-3 和 -10^3 不一样
    • @shkristensen 我没有使用 y = [-1000,-100,-10,1,10,100,1000];我使用了她想要绘制的通用公式。当然我知道 10^-3 不是 -10^3。
    【解决方案4】:

    @thewaywewalk 已经给出了一个漂亮的解决方案。我建议的是对它的epsilon改进。如果您进行两项更改 (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 刻度显示中得到改进。我得到了以下内容。 enter image description here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      相关资源
      最近更新 更多