Matlab对数图中的轴相等
在Matlab中,命令“轴相等”: 设置纵横比,使其等于刻度线 x、y和z轴上的增量大小相等。这 使球体(25)看起来像球体,而不是椭球体 但是,当使用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(从平方开始),这样就不会有额外
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]);