gpt4 book ai didi

matlab - Matlab loglog 图中的轴相等

转载 作者:太空宇宙 更新时间:2023-11-03 19:10:15 25 4
gpt4 key购买 nike

在 Matlab 中,命令“axis equal”:

sets the aspect ratio so that equal tick mark increments on the x-,y- and z-axis are equal in size. This makes SPHERE(25) look like a sphere, instead of an ellipsoid

但是,当使用 loglog 绘图函数时,这不能“正常”工作。我想要发生的是我得到一个纵横比,以便给定的 factor 占据相同的视觉距离。实际发生的是

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

结果

alt text

而不是

alt text

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

我的问题是:

Is there a Matlab command that does this for me? Alternatively, has anyone solved this problem before?

最佳答案

一种解决方案是让您修改 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

这是结果图:

alt text

请注意,y 轴上 100 和 102 刻度线之间的空间跨越与 1010 之间的空间相同的像素数 和 x 轴上的 1012 刻度线,从而使一个轴上的十年等于另一个轴上的十年。

如果您不想更改坐标区限制,而是想使用 MATLAB 选择的默认限制,您可以简单地从坐标区获取限制以执行计算:

xLimits = get(hAxes,'XLim');
yLimits = get(hAxes,'YLim');

但是,为了禁用 MATLAB 的自动轴调整大小行为,您仍然必须将轴限制设置为相同的值设置 limit mode properties更新 'DataAspectRatio' 属性时为 'manual':

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 轴上。

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

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]);

这将给出与以前相同的缩放结果。

关于matlab - Matlab loglog 图中的轴相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4133510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com