MATLABを使用していくつかのデータをプロットしていますが、軸ラベルと軸自体の間の距離を調整したいと思います。ただし、ラベルの「Position」プロパティにビットを追加するだけで、ラベルはFigureウィンドウの外に移動します。 「マージン」プロパティなどはありますか?
上の図では、ラベルが範囲外に移動しないように、数字のサイズを自動的に拡大しながら、数字とラベル「Time(s)」の間の距離を広げたいと思います。
これが私が図/軸を設定する方法です。
figure;
set(gca, ...
'Box' , 'off' , ...
'LooseInset' , get(gca, 'TightInset') * 1.5 , ...
'TickDir' , 'in' , ...
'XMinorTick' , 'off' , ...
'YMinorTick' , 'off' , ...
'TickLength' , [.02 .02] , ...
'LineWidth' , 1 , ...
'XGrid' , 'off' , ...
'YGrid' , 'off' , ...
'FontSize' , 18 );
私はあなたが望むことを正確に行うべき関数を書きました。軸をまったく同じサイズと位置に保ち、xラベルを下に移動し、図のサイズを大きくして、ラベルを表示するのに十分な大きさにします。
_function moveLabel(ax,offset,hFig,hAxes)
% get figure position
posFig = get(hFig,'Position');
% get axes position in pixels
set(hAxes,'Units','pixels')
posAx = get(hAxes,'Position');
% get label position in pixels
if ax=='x'
set(get(hAxes,'XLabel'),'Units','pixels')
posLabel = get(get(hAxes,'XLabel'),'Position');
else
set(get(hAxes,'YLabel'),'Units','pixels')
posLabel = get(get(hAxes,'YLabel'),'Position');
end
% resize figure
if ax=='x'
posFigNew = posFig + [0 -offset 0 offset];
else
posFigNew = posFig + [-offset 0 offset 0];
end
set(hFig,'Position',posFigNew)
% move axes
if ax=='x'
set(hAxes,'Position',posAx+[0 offset 0 0])
else
set(hAxes,'Position',posAx+[offset 0 0 0])
end
% move label
if ax=='x'
set(get(hAxes,'XLabel'),'Position',posLabel+[0 -offset 0])
else
set(get(hAxes,'YLabel'),'Position',posLabel+[-offset 0 0])
end
% set units back to 'normalized' and 'data'
set(hAxes,'Units','normalized')
if ax=='x'
set(get(hAxes,'XLabel'),'Units','data')
else
set(get(hAxes,'YLabel'),'Units','data')
end
end
_
この場合、offset
はピクセル単位の絶対オフセットである必要があります。相対オフセットが必要な場合は、この関数を簡単に書き直すことができると思います。 hFig
はFigureハンドルで、hAxes
はAxesハンドルです。
編集:関数を呼び出す前に、_hFig = figure;
_を使用して図を作成し、_hAxes = axes;
_で軸を作成します(次に、質問で行ったように軸を設定します:set(hAxes,...)
)。
EDIT2:hAxes
の_'Units'
_とXLabel
がそれぞれ「正規化」と「データ」に戻される行を追加しました。そうすれば、サイズ変更後もフィギュアは思い通りになります。
EDIT3:XラベルとYラベルの両方で機能するように関数を変更しました。追加の入力ax
は_'x'
_または_'y'
_である必要があります。
これは、軸の位置をxlabelで調整することで実現できます。また、位置がデータ範囲に依存しないように、「正規化された」単位を使用することをお勧めします。次に例を示します。
figure
plot(Rand(1,10))
set(gca, 'Units', 'Normalized');
pos = get(gca, 'Position');
offset = 0.1;
set(gca, ...
'Box' , 'off' , ...
'LooseInset' , get(gca, 'TightInset') * 1.5 , ...
'TickDir' , 'in' , ...
'XMinorTick' , 'off' , ...
'YMinorTick' , 'off' , ...
'TickLength' , [.02 .02] , ...
'LineWidth' , 1 , ...
'XGrid' , 'off' , ...
'YGrid' , 'off' , ...
'FontSize' , 18 , ...
'Position' , pos + [0, offset, 0, -offset]);
h = xlabel('Time (s)');
set(h, 'Units', 'Normalized');
pos = get(h, 'Position');
set(h, 'Position', pos + [0, -offset, 0]);
私はこれが答えられたことを知っていますが、これは(ある程度)より簡単な方法です:
relative_offset = 1.5;
close all;
figure(99);clf
plot(Rand(1,10))
xlabel('The x-axis')
xh = get(gca,'XLabel'); % Handle of the x label
pause(0.2)
set(xh, 'Units', 'Normalized')
pause(0.2)
pos = get(xh, 'Position');
set(xh, 'Position',pos.*[1,relative_offset,1])
私のシステムは奇妙な方法でそれ自体よりも先に進むので、一時停止コマンドを含めました。
/ニールズ