web-dev-qa-db-fra.com

Comment définir la taille de la sous-parcelle dans la figure MATLAB?

J'ai souvent besoin de tracer 10 images ensemble, mais l'utilisation de ce code donne de petites images: 

img = Rand(400,600); 
for i=1:10
 subplot(2,5,i); 
 imshow(img); 
 title(['Image ' int2str(i)]); 
end

Comme vous pouvez le constater, les images n'utilisent pas tout l'espace disponible à l'écran. Comment puis-je augmenter la taille ou diminuer le remplissage/la marge entre eux?

enter image description here

Merci pour toute aide.

8
jeff

Je ne crois pas qu'il existe un moyen facile de le faire. Il y a deux options:

Tout d’abord, utilisez la partie position de la sous-parcelle:

>> subplot(2,5, i, [l, b, w, h])

et calculer la gauche, le bas, la largeur, la hauteur.

Ou bien, récupérez la poignée de l'axe renvoyé:

>> h(i) = subplot(2,5,i);

puis modifiez ensuite l’axe.

>> set(h(1), 'position', [l, b, w, h] );

Plusieurs pages donneront plus de détails, par exemple, http://www.briandalessandro.com/blog/how-to-make-a-borderless-subplot-of-images-in-matlab/

[mettre à jour]

Le code ci-dessous donne un peu plus de détails sur qui vous pouvez faire quelque chose comme ce que vous recherchez. C'est un peu fastidieux. Les 0.95 et 0.02 sont juste pour donner un peu de rembourrage. Ils ne sont rien de magique. :-)

Une autre chose à noter est que je vous encourage vraiment à utiliser "ii" comme variable d'index (ou quelque chose d'autre) car "i" est défini comme sqrt (-1). C'est une bonne convention de ne pas utiliser "i" et "j" comme variables d'index (en particulier dans Matlab).

img = Rand(400,600); 

figure(1);
clf();
hold on;

% Get the width and height of the figure
lbwh = get(1, 'position');
figw = lbwh(3);
figh = lbwh(4);

% Number of rows and columns of axes
ncols = 5;
nrows = 2;

% w and h of each axis in normalized units
axisw = (1 / ncols) * 0.95
axish = (1 / nrows) * 0.95

for ii=1:10

    % calculate the row and column of the subplot
    row = floor( ii/(ncols+1) ) + 1
    col = mod( ii-1, ncols ) + 1

    % calculate the left, bottom coordinate of this subplot
    axisl = (axisw+0.02) * (col-1)
    axisb = (axish+0.02) * (row-1)

    %  plot the subplot
    h= subplot('position', [axisl, axisb, axisw, axish] ); 
    imshow(img); 
    title(['Image ' int2str(ii)]); 

    pause
end

Vous devrez jouer avec pour faire exactement ce que vous voulez. Et "aide" est votre ami.

9
brechmos

J'ai souvent cette exigence et le moyen le plus efficace pour y parvenir consiste à utiliser la fonction tierce subplot_tight , qui remplace plus ou moins la fente de subplot. Au plus simple, vous pouvez faire

figure(1); clf
subplot_tight(1,2,1, [0.05 0.05])
%normal plot stuff

où les deux paramètres du quatrième argument contrôlent la fraction d'espace visible autour de l'image.

4
xenoclast

D'après la réponse de @brechmos, lorsque le numéro de votre sous-parcelle est supérieur à 10, son code déclenchera une erreur.

 % calculate the row and column of the subplot
 row = floor( ii/(ncols+1) ) + 1
 col = mod( ii-1, ncols ) + 1

par exemple. 4X5 cellules, alors la sous-parcelle 11 sera interprétée à tort comme (2, 1), mais pas (3,1).

Le remplacer par le code ci-dessous peut résoudre ce problème:

% calculate current row and column of the subplot
row = floor( (i-0.5)/ncols ) + 1;
col = mod(i-(row-1)*ncols, ncols+1); 
3
ouxiaogu

Vous pouvez utiliser l'option propriétés de la figure une fois que vous avez généré le tracé. Cliquez sur la sous-parcelle que vous souhaitez redimensionner. Dans l'éditeur de propriétés, sélectionnez l'option "Plus de propriétés". Là, si vous faites défiler, vous verrez l'onglet «Position». Vous pouvez modifier ces valeurs pour voir comment la sous-parcelle se déplace et ajuster ainsi la sous-parcelle selon vos préférences.

0
Nahar