サブプロットに単純なラベルを付けたいと思います。残念ながら、私は醜い振る舞いをしています。次の関数を検討してください。
function h = set_label1(label)
tlh = get(gca, 'Title');
if strcmp(get(tlh, 'String'), '')
title(' ');
end
ylh = get(gca, 'YLabel');
if strcmp(get(ylh, 'String'), '')
ylabel(' ');
end
ylp = get(ylh, 'Position');
x = ylp(1);
tlp = get(tlh, 'Position');
y = tlp(2);
h = text('String', label, ...
'HorizontalAlignment', 'right',...
'VerticalAlignment', 'Baseline', ...
'FontUnits', 'pixels', ...
'FontSize', 16, ...
'FontWeight', 'bold', ...
'FontName', 'Arial', ...
'Position', [x y 0]);
end
簡単なテスト実行を次に示します。
figure;
h1 = axes('OuterPosition', [0,0,.5 1]);
set(h1,'LooseInset',get(h1,'TightInset'));
h2 = axes('OuterPosition', [.5,0,.5 1]);
set(h2,'LooseInset',get(h2,'TightInset'));
axes(h1);
plot([0 1], [4 5]);
set_label1('A');
axes(h2);
plot([0 1], [4 5]);
set_label1('B');
私が得る写真は次のとおりです。
Figure のサイズを変更すると、ラベルが正しい位置になくなります。それは結構です、私はそれを期待していました(それらを元の場所に戻す方法を知っていて、それを教えてくれたらとてもうれしいです).
私が直面している問題は、「データ」単位でラベルの位置を指定したくないということです。代わりに、正規化された単位を使用したいと思います。そのため、関数の変更された形式を使用しました。これを使用してみましょう:
function h = set_label2(label)
tlh = get(gca, 'Title');
if strcmp(get(tlh, 'String'), '')
title(' ');
end
ylh = get(gca, 'YLabel');
if strcmp(get(ylh, 'String'), '')
ylabel(' ');
end
oldUnits = replace_prop(ylh, 'Units', 'normalized');
ylp = get(ylh, 'Position');
x = ylp(1);
set(ylh, 'Units', oldUnits);
oldUnits = replace_prop(tlh, 'Units', 'normalized');
tlp = get(tlh, 'Position');
y = tlp(2);
set(ylh, 'Units', oldUnits);
h = text('String', label, ...
'HorizontalAlignment', 'right',...
'VerticalAlignment', 'Baseline', ...
'FontUnits', 'pixels', ...
'FontSize', 16, ...
'FontWeight', 'bold', ...
'FontName', 'Arial', ...
'Units', 'normalized',...
'Position', [x y 0]);
end
function oldvalue = replace_prop(handle, propName, newvalue)
oldvalue = get(handle, propName);
set(handle, propName, newvalue);
end
同じテストを実行します:
figure;
h1 = axes('OuterPosition', [0,0,.5 1]);
set(h1,'LooseInset',get(h1,'TightInset'));
h2 = axes('OuterPosition', [.5,0,.5 1]);
set(h2,'LooseInset',get(h2,'TightInset'));
axes(h1);
plot([0 1], [4 5]);
set_label2('A');
axes(h2);
plot([0 1], [4 5]);
set_label2('B');
以前とまったく同じ画像が得られます。唯一の問題は、サイズを変更すると何か問題が発生することです。
ラベルは実際には正しい位置にあります。しかし、私が使用した'LooseInset'
and'TightInset'
プロパティは、ラベルがないかのように軸を動作させているようです。これに対する修正はありますか?本当に私がしているのは、データ単位ではなく、正規化された単位でタイトルと ylabel の位置を取得することだけであり、これは混乱しているようです。
正規化された単位で取得する必要がある理由は、3D プロットを取得するときに、タイトルと zlabel に対してラベルを配置できるようにするためです。