在Matlab中命令'axis equal':
设置纵横比以使刻度标记相等 x轴,y轴和z轴上的增量大小相等。这个 使SPHERE(25)看起来像一个球体,而不是椭圆体
但是,使用loglog
绘图功能时,这“无法正常”工作。我想要发生的是我获得宽高比,以便给定的因子占据相同的视觉距离。实际发生的是
>> loglog(2.^[1:20]*1e10,(2.^[1:20]).^2)
>> axis equal
结果
而不是
因此可以很容易地观察到斜率2(来自平方),因此不会有额外的空白区域。
我的问题是:
是否有Matlab命令为我执行此操作?或者,有人解决过这个问题吗?
答案 0 :(得分:10)
一种解决方案是让您自己修改axes limits和'DataAspectRatio'
属性,以便一个轴上的十年等于十年。以下是您可以为自己的例子做的事情:
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轴上10 0 和10 2 刻度线之间的间距跨越10 10之间的空间相同的像素数和10个 12 刻度线在x轴上,因此在一个轴上十年等于十年。
如果您不想更改轴限制,而是想使用MATLAB选择的默认限制,您只需从轴获取限制即可执行计算:
xLimits = get(hAxes,'XLim');
yLimits = get(hAxes,'YLim');
但是,为了禁用MATLAB的自动轴调整大小行为,您仍然必须将轴限制设置为相同的值或将limit mode properties设置为'manual'
时您更新'DataAspectRatio'
属性:
set(gca,'Xlim',xLimits,'YLim',yLimits,...
'DataAspectRatio',[1 logScale/powerScale 1]);
%# OR...
set(gca,'XLimMode','manual','YLimMode','manual',...
'DataAspectRatio',[1 logScale/powerScale 1]);
如果所有这些看起来像很多工作,你可以通过把它全部放入一个函数来简化事情。我实际上会根据此答案中的代码向MathWorks File Exchange提交函数decades_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
您可以按如下方式调用该函数:
loglog(2.^[1:20]*1e10,(2.^[1:20]).^2); %# Plot your sample data
decades_equal(gca); %# Make the decades equal sizes
您可能想知道我选择上述缩放因子背后的逻辑是什么。当试图使每个轴的显示尺寸相等时,我们必须考虑轴范围内数十年的数量和大小。在上面的代码中,我基本上计算每个轴的平均十进制大小,然后使用平均十进制大小的比率来相应地缩放轴。例如,diff(yLimits)
给出y轴的总大小,diff(log10(yLimits))
给出y轴上显示的十进制数(即10的幂)。
如果我重新排序上述代码中的操作,可能会更容易看到:
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]);
这将提供与以前相同的缩放结果。