Comment définir la taille des sous-lots dans la figure MATLAB?

j'ai souvent besoin de tracer 10 images ensemble, mais l'utilisation de ce code produit 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 voir, les images ne pas utiliser tout l'espace disponible à l'écran. Comment puis-je augmenter la taille, ou diminuer le rembourrage/marge entre eux?

enter image description here

Merci pour votre aide.

8
demandé sur jeff 2014-06-09 20:59:41

4 réponses

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

tout D'abord, utilisez la partie de position du sous-lot:

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

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

Ou, au bout de la poignée de l'axe retourné:

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

puis modifier l'axe après.

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

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

[mise à jour]

Le code ci-dessous donne un peu plus de détails sur qui vous pouvez faire quelque chose comme ce que vous cherchez. 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 votre variable d'index (ou quelque chose d'autre) comme "i" est défini comme sqrt (-1). C'est une bonne convention de ne pas utiliser "i" et "j" comme variables d'indice (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 qu'il fasse exactement ce que vous voulez. Et "aide" est ton ami.

8
répondu brechmos 2014-06-09 19:23:17

j'ai souvent cette exigence et le moyen le plus efficace pour la réaliser est d'utiliser le tiers subplot_tight fonction, qui est un plus ou moins slot-in de remplacement pour subplot. À son 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
répondu xenoclast 2015-04-21 08:08:42

basé sur la réponse de @brechmos, quand votre nombre de sous-lots est supérieur à 10, alors 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

p. ex. cellules 4X5, alors le sous-Lot 11 sera mal interprété comme (2, 1), mais pas (3,1).

Remplacer par le code ci-dessous peut résoudre le 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
répondu ouxiaogu 2015-08-15 07:53:52

vous pouvez utiliser l'option de propriétés de la figure une fois que vous générez la parcelle. Cliquez sur le sous-lot que vous souhaitez redimensionner. Dans l'éditeur de propriétés, sélectionnez l'option "plus de propriétés". Si vous faites défiler, vous pouvez voir 'Position'. Vous pouvez changer ces valeurs pour voir comment l'intrigue secondaire se déplace et donc ajuster intrigue secondaire selon vos préférences.

0
répondu Nahar 2017-01-10 22:42:24