1つの解決策は、軸の制限と'DataAspectRatio'
プロパティを自分で変更して、一方の軸の10年がもう一方の軸の10年と等しくなるようにすることです。これがあなたの例のためにそれをすることができる方法です:
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の目盛りの間のスペースと同じピクセル数にまたがっていることに注意してください。したがって、1つの軸の10年はaに等しくなります。他の10年。
軸の制限を変更せず、代わりにMATLABで選択されたデフォルトの制限を使用する場合は、軸から制限をフェッチして計算を実行できます。
xLimits = get(hAxes,'XLim');
yLimits = get(hAxes,'YLim');
ただし、MATLABの自動軸サイズ変更動作を無効にするには、軸の制限を同じ値に設定するか、プロパティを更新するときに制限モードのプロパティをに設定する必要があります。'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]);
これらすべてが大変な作業のように思われる場合は、すべてを関数に入れることで物事を単純化できます。この回答のコードに基づいて、実際に関数decades_equal
をMathWorksFileExchangeに送信します。とりあえず、使用できる縮小版(エラーチェックやヘルプなし)を次に示します。
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
使い方...
上記のスケーリング係数をどのように選択したかについて、ロジックが何であるか疑問に思われるかもしれません。表示される10年のサイズを各軸で等しくしようとする場合、軸の範囲内の10年の数とサイズの両方を考慮する必要があります。上記のコードでは、基本的に各軸の平均10年サイズを計算し、平均10年サイズの比率を使用してそれに応じて軸をスケーリングしています。たとえばdiff(yLimits)
、y軸の合計サイズを示し、y軸にdiff(log10(yLimits))
表示される10年数(つまり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]);
これにより、以前と同じスケーリング結果が得られます。