16

Matlabでは、コマンド'axis equal':

x軸、y軸、z軸の目盛りの増分が等しくなるようにアスペクト比を設定します。これにより、SPHERE(25)は楕円体ではなく、球のように見えます。

ただし、loglogプロット機能を使用する場合、これは「正しく」機能しません。私がしたいのは、与えられた要素が同じ視覚距離を占めるようにアスペクト比を取得することです。実際に起こることはそれです

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

結果は

代替テキスト

それよりも

代替テキスト

(2乗からの)勾配2を簡単に観察できるようにし、余分な空白がないようにします。

私の質問は:

これを行うMatlabコマンドはありますか?あるいは、誰かが以前にこの問題を解決したことがありますか?

4

1 に答える 1

11

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_equalMathWorksFileExchangeに送信します。とりあえず、使用できる縮小版(エラーチェックやヘルプなし)を次に示します。

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

これにより、以前と同じスケーリング結果が得られます。

于 2010-11-09T17:20:29.393 に答える