54 votes

Suppression de l'espace blanc autour de la sortie pdf de la figure de matlab

J'aimerais utiliser des versions PDF de mes graphiques matlab dans un document LaTeX. J'enregistre les figures à l'aide de la commande "saveas" avec l'option PDF, mais j'obtiens d'énormes espaces blancs autour de mes graphiques dans les fichiers PDF. Est-ce normal ? Comment puis-je m'en débarrasser ? Automatiquement, bien sûr, puisque j'ai "beaucoup" de tracés.

1 votes

2 votes

J'ai pdfcrop dans mon flux de travail pour me débarrasser des espaces après coup. Cela aide aussi beaucoup d'autres programmes qui produisent des PDF sous forme de feuilles de papier entières.

0 votes

Avez-vous appelé le service clientèle ? Matlab est un logiciel commercial coûteux, après tout.

15voto

zellus Points 7713

Exportation de chiffres pour la publication est un bon point de départ. Au lieu de -deps utiliser -dpdf pour la sortie en pdf.

Vous pouvez résoudre le problème du bounding box en utilisant le code ci-dessous.

set(gcf, 'PaperSize', [6.25 7.5]);
set(gcf, 'PaperPositionMode', 'manual');
set(gcf, 'PaperPosition', [0 0 6.25 7.5]);

set(gcf, 'PaperUnits', 'inches');
set(gcf, 'PaperSize', [6.25 7.5]);
set(gcf, 'PaperPositionMode', 'manual');
set(gcf, 'PaperPosition', [0 0 6.25 7.5]);

set(gcf, 'renderer', 'painters');
print(gcf, '-dpdf', 'my-figure.pdf');
print(gcf, '-dpng', 'my-figure.png');
print(gcf, '-depsc2', 'my-figure.eps');

Vous pouvez en savoir plus à ce sujet sur Tobin's article.

0 votes

Les lecteurs pourraient également être intéressés par ce document, qui constitue une référence plus à jour : Création et exportation de graphiques de qualité de publication

13voto

emrea Points 860

Voici une solution moins douloureuse que celle de Tobin : http://tipstrickshowtos.blogspot.com/2010/08/how-to-get-rid-of-white-margin-in.html

9voto

Antonio Points 21

Les réponses ci-dessus semblent trop compliquées. Cette fonction utilise un handle de figure et une chaîne de caractères pour imprimer le tout dans un fichier pdf sans les énormes marges.

function printpdf(h,outfilename)

set(h, 'PaperUnits','centimeters');
set(h, 'Units','centimeters');
pos=get(h,'Position');
set(h, 'PaperSize', [pos(3) pos(4)]);
set(h, 'PaperPositionMode', 'manual');
set(h, 'PaperPosition',[0 0 pos(3) pos(4)]);
print('-dpdf',outfilename);

Par exemple, pour imprimer le chiffre actuel, vous pouvez l'appeler avec :

printpdf(gcf,'trash')

Cependant, si vous voulez vraiment une figure pdf comme un eps généré par Matlab, c'est-à-dire seulement la coque convexe rectangulaire du graphe (ou de l'ensemble des sous-graphes), voici la version plus sophistiquée :

function printpdf(h,outfilename)

% first use the same non-relative unit system for paper and screen (see
% below)
set(h,'PaperUnits','centimeters');

% now get all existing plots/subplots
a=get(h,'Children');
nfigs=length(a);

% bounds will contain lower-left and upper-right corners of plots plus one
% line to make sure single plots work
bounds=zeros(nfigs+1,4);
bounds(end,1:2)=inf;
bounds(end,3:4)=-inf;

% generate all coordinates of corners of graphs and store them in
% bounds as [lower-left-x lower-left-y upper-right-x upper-right-y] in
% the same unit system as paper (centimeters here)
for i=1:nfigs
    set(a(i),'Unit','centimeters');
    pos=get(a(i),'Position');
    inset=get(a(i),'TightInset');
    bounds(i,:)=[pos(1)-inset(1) pos(2)-inset(2) ...
        pos(1)+pos(3)+inset(3) pos(2)+pos(4)+inset(4)];
end

% compute the rectangular convex hull of all plots and store that info
% in mypos as [lower-left-x lower-left-y width height] in centimeters
auxmin=min(bounds(:,1:2));
auxmax=max(bounds(:,3:4));
mypos=[auxmin auxmax-auxmin];

% set the paper to the exact size of the on-screen figure using
% figure property PaperSize [width height]
set(h,'PaperSize',[mypos(3) mypos(4)]);

% ensure that paper position mode is in manual in order for the
% printer driver to honor the figure properties
set(h,'PaperPositionMode', 'manual');

% use the PaperPosition four-element vector [left, bottom, width, height]
% to control the location on printed page; place it using horizontal and
% vertical negative offsets equal to the lower-left coordinates of the
% rectangular convex hull of the plot, and increase the size of the figure
% accordingly
set(h,'PaperPosition',[-mypos(1) -mypos(2) ...
    mypos(3)+mypos(1) mypos(4)+mypos(2)]);

% print stuff
print('-dpdf',outfilename);

0 votes

Pour un exemple de la façon dont le pdf rendu diffère entre ces deux fonctions, veuillez voir ces deux captures d'écran. Premier bloc de code , Deuxième bloc de code (coque convexe rectangulaire uniquement). Notez comment, dans la deuxième image, le tracé est juste contre le coin inférieur gauche. Notez également que ces images semblent être de véritables images vectorielles (et non matricielles), ce qui, pour moi, est ce dont j'avais besoin, même si j'aimerais avoir encore moins d'espace blanc. En tout cas, merci Antonio !

6voto

anon55 Points 41

J'ai souffert un peu à ce sujet avant de trouver une réponse facile. Enregistrez en .eps, puis convertissez le .eps en .pdf. Sous Mac OS, cela peut être fait dans Aperçu.

5voto

Yair Altman Points 4091

En plus des autres suggestions ici, vous pouvez également essayer d'utiliser la propriété LooseInset comme décrit dans http://UndocumentedMatlab.com/blog/axes-looseinset-property/ pour supprimer l'espace supplémentaire autour de vos axes de tracé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X