Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab对数图中的轴相等_Matlab_Plot_Logarithm - Fatal编程技术网

Matlab对数图中的轴相等

Matlab对数图中的轴相等,matlab,plot,logarithm,Matlab,Plot,Logarithm,在Matlab中,命令“轴相等”: 设置纵横比,使其等于刻度线 x、y和z轴上的增量大小相等。这 使球体(25)看起来像球体,而不是椭球体 但是,当使用loglogplotting功能时,该功能无法“正常”工作。我希望得到一个纵横比,这样给定的因子占据相同的视觉距离。实际上发生的是 >> loglog(2.^[1:20]*1e10,(2.^[1:20]).^2) >> axis equal 导致 而不是 这样就可以很容易地观察到斜率2(从平方开始),这样就不会有额外

在Matlab中,命令“轴相等”:

设置纵横比,使其等于刻度线 x、y和z轴上的增量大小相等。这 使球体(25)看起来像球体,而不是椭球体

但是,当使用
loglog
plotting功能时,该功能无法“正常”工作。我希望得到一个纵横比,这样给定的因子占据相同的视觉距离。实际上发生的是

>> loglog(2.^[1:20]*1e10,(2.^[1:20]).^2)
>> axis equal
导致

而不是

这样就可以很容易地观察到斜率2(从平方开始),这样就不会有额外的空白

我的问题是:

有没有一个Matlab命令可以帮我做到这一点?或者,以前有人解决过这个问题吗


一种解决方案是您自己修改和属性,以便一个轴上的十年等于另一个轴上的十年。以下是您的示例中的操作方法:

loglog(2.^[1:20]*1e10,(2.^[1:20]).^2);   %# Plot your sample data
xLimits = [1e10 1e16];                   %# Limits for the x axis
yLimits = [1 1e12];                      %# Limits for the y axis
logScale = diff(yLimits)/diff(xLimits);  %# Scale between the x and y ranges
powerScale = diff(log10(yLimits))/...    %# Scale between the x and y powers
             diff(log10(xLimits));
set(gca,'Xlim',xLimits,'YLim',yLimits,...              %# Set the limits and the
        'DataAspectRatio',[1 logScale/powerScale 1]);  %#   data aspect ratio
set(gca,'XTick',[1e10 1e12 1e14 1e16]);  %# Change the x axis tick marks
下面是结果图:

请注意,y轴上的100和102个记号之间的间距与x轴上的1010和1012个记号之间的间距跨越相同数量的像素,从而使一个轴上的十年等于另一个轴上的十年

如果您不想更改轴限制,而是想使用MATLAB选择的默认限制,则可以从轴获取限制以执行计算:

xLimits = get(hAxes,'XLim');
yLimits = get(hAxes,'YLim');
但是,为了禁用MATLAB的自动轴大小调整行为,在更新
'DataAspectRatio'
属性时,您仍然必须将轴限制设置为相同的值,或者将
设置为“手动”

set(gca,'Xlim',xLimits,'YLim',yLimits,...
        'DataAspectRatio',[1 logScale/powerScale 1]);
%# OR...
set(gca,'XLimMode','manual','YLimMode','manual',...
        'DataAspectRatio',[1 logScale/powerScale 1]);
如果所有这些看起来都是大量的工作,您可以通过将其全部放入函数中来简化工作。实际上,我将根据此答案中的代码向提交一个函数
degreats_equal
。目前,您可以使用以下精简版本(即无错误检查或帮助):

function decades_equal(hAxes,xLimits,yLimits)

  if (nargin < 2) || isempty(xLimits)
    xLimits = get(hAxes,'XLim');
  end
  if (nargin < 3) || isempty(yLimits)
    yLimits = get(hAxes,'YLim');
  end

  logScale = diff(yLimits)/diff(xLimits);
  powerScale = diff(log10(yLimits))/diff(log10(xLimits));

  set(hAxes,'Xlim',xLimits,...
            'YLim',yLimits,...
            'DataAspectRatio',[1 logScale/powerScale 1]);

end

它是如何工作的。。。 您可能想知道,我选择上述比例因子的背后是什么逻辑。当试图使每个轴显示的十年大小相等时,我们必须考虑轴范围内十年的数量和大小。在上面的代码中,我基本上是计算每个轴的平均十年大小,然后使用平均十年大小的比率来相应地缩放轴。例如,
diff(yLimits)
给出y轴的总大小,
diff(log10(yLimits))
给出y轴上显示的十年数(即十次幂)

如果我对上述代码中的操作重新排序,这可能会更容易看到:

yDecade = diff(yLimits)/diff(log10(yLimits));  %# Average y decade size
xDecade = diff(xLimits)/diff(log10(xLimits));  %# Average x decade size
set(gca,'XLim',xLimits,'YLim',yLimits,...
        'DataAspectRatio',[1 yDecade/xDecade 1]);

这将得到与以前相同的缩放结果。

Nice。这与我找到的解决方案类似,尽管我希望有更自动化的解决方案(例如,没有手动设置轴),所以我从axis()获取了限制。然而,问题是,当你改变纵横比时,限制可能会改变(除非你像你一样手动设置它们)…将你的例子与我更仔细地做的比较,我意识到解决方案根本不一样。我真的不明白你做了什么…特别是,我不明白你为什么需要
logScale
(但它显然是有效的!!)@Yossi:这些评论不够大,我无法解释一切,所以我会很快更新我的答案,解释它是如何工作的。
yDecade = diff(yLimits)/diff(log10(yLimits));  %# Average y decade size
xDecade = diff(xLimits)/diff(log10(xLimits));  %# Average x decade size
set(gca,'XLim',xLimits,'YLim',yLimits,...
        'DataAspectRatio',[1 yDecade/xDecade 1]);