8

1 つの図のサブプロットに配置する 3 つのオブジェクト (写真と 2 つのプロット) があります。次のようになります。

画像

しかし、お気づきのように、写真は正方形ではなく長方形であるべきです。私はそれをこのようにしようとしました(ここMatlab: How to align the axes of subplots when one of them contains a colorbar? にあります):

main=subplot(4,4,[5,6,7,9,10,11,13,14,15])  %photo
imagesc(im); 
axis('image')  
pion=subplot(4,4,[8,12,16]); %right plot (rotated)
view(90, 90)
plot(ypion,Ppion,'.k');
poz=subplot(4,4,1:3); %upper plot
plot(xpoz,Ppoz,'.k');

pos1=get(poz,'Position')
pos2=get(main,'Position')
pos3=get(pion,'Position')

pos1(3) = pos2(3); %width for the upper plot
set(poz,'Position',pos1)
pos3(4) = pos2(4); %height for the right plot
set(pion,'Position',pos3) 

私が得るのは次のようなものです: 画像

上部のプロットの幅を写真自体 (写真のサブプロットとしてではなく) にする方法を教えてください。写真がサブプロット領域を埋めないため、サブプロットの幅を等しく設定しても機能しません。

4

5 に答える 5

4

The command axis image adjust the image axis ratio. So, in principle, if you adjust the plot ratios of the two plots to the same ratio, it will do what you want.

There is one caveat; the image is inherently 3 times wider or higher than the plots, due to the fact that you've plotted it in 3x3 subplots, vs 1x3 for the top and 3x1 for the right plots. So, you'll have to divide either the x or y ratios of the plots by 3.

Some example code:

clc, clf

% generate some bogus data

ypion = rand(500,1);
Ppion = 450*rand(500,1);

xpoz  = rand(500,1);
Ppoz  = 450*rand(500,1);

% Load photo
photoSub = subplot(4,4,[5,6,7,9,10,11,13,14,15]);
load mandrill
photo = imagesc([X,X]);
colormap(map)

axis image 

photoAxs = gca;
photoAxsRatio = get(photoAxs,'PlotBoxAspectRatio')

% right plot 
subplot(4,4,[8,12,16]); 
plot(Ppion,ypion,'k.');
rightAxs = gca;
axis tight

% upper plot
subplot(4,4,[1 2 3]);
plot(xpoz,Ppoz,'k.');
topAxs = gca;
axis tight


% adjust ratios
topAxsRatio = photoAxsRatio;
topAxsRatio(2) = photoAxsRatio(2)/3.8;    % NOTE: not exactly 3...
set(topAxs,'PlotBoxAspectRatio', topAxsRatio)

rightAxsRatio = photoAxsRatio;
rightAxsRatio(1) = photoAxsRatio(1)/3.6;  % NOTE: not exactly 3...
set(rightAxs,'PlotBoxAspectRatio', rightAxsRatio)

This gives the following result:

Side by Side

Just to test, changing photo = imagesc([X,X]); to photo = imagesc([X;X]); gives this:

over-under

Note that I did not divide the ratios by 3 exactly; it only came out OK if I used factors closer to 4. I do not know why that is; AFAIK, a factor of 3 should do the trick...

Oh well, at least you have something to work with now :)

于 2013-04-04T11:38:46.383 に答える
0

この特定のケースではaxes、 high-level の代わりに low-level を直接使用することをお勧めしますsubplot。作成した 3 つのオブジェクトのプロパティを
使用して、適切なサイズで適切な場所に配置します。'OuterPosition'axes

于 2013-04-04T10:26:10.410 に答える
0

画像をに合わせたい場合(歪んだ画像):

に変更axis('image')axis('tight') ます。

画像の縦横比を維持し、軸を画像に合わせたい場合:

これは簡単で汚いですが、 を適用した後axis('tight')、図のサイズを適切な縮尺に変更します...

于 2013-04-04T10:46:01.517 に答える