Sbarazzati dello spazio bianco attorno all’output pdf della figura di MATLAB

Mi piacerebbe utilizzare le versioni PDF dei miei grafici matlab in un documento LaTeX. Sto salvando le cifre usando il comando “saveas” con l’opzione PDF ma ottengo un enorme spazio bianco attorno ai miei grafici nei file pdf. È normale? Come posso liberarmene? Automaticamente, ovviamente, dal momento che ho “un sacco” di trame.

Esportare cifre per la pubblicazione è un buon punto di partenza. Invece di -deps usa -dpdf per l’output pdf.

È ansible risolvere il problema del riquadro di selezione utilizzando il codice riportato di seguito.

 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'); 

Puoi leggere di più su questo articolo di Tobin .

Le risposte sopra sembrano troppo complicate. Questa funzione utilizza un handle di figura e una stringa per stampare le cose in un file pdf senza enormi margini.

 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); 

Ad esempio, per stampare la figura corrente puoi chiamarla con:

 printpdf(gcf,'trash') 

Tuttavia, se vuoi davvero una figura in formato pdf come un eps generato da Matlab, cioè solo lo scafo convesso rettangular della trama (o un insieme di sottotrame), ecco la versione più sofisticata:

 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); 

Ho sofferto un po ‘per quanto riguarda questo b4 trovando una risposta facile. Salva come .eps, quindi converti i file .eps in .pdf. In Mac OS questo può essere fatto in Anteprima.

Oltre agli altri suggerimenti qui, potresti anche provare a utilizzare la proprietà LooseInset come descritto in http://UndocumentedMatlab.com/blog/axes-looseinset-property/ per rimuovere ulteriore spazio attorno agli assi del tuo plot.

Ho appena trascorso un po ‘di tempo a provare molte di queste opzioni, ma il mio amico Espen ha sottolineato la più semplice: se stai usando il pacchetto graphicx in LaTeX, vai con l’output standard Matlab pdf e usa l’opzione di ritaglio in \ includegraphics. Un esempio in una diapositiva di Beamer:

\ includegraphics [trim = 0.1in 2.5in 0.1in 2.5in, clip, scale = 0.5] {matlabgraphic.pdf}

L’ordine dei parametri del trim qui è a sinistra, in basso, a destra, in alto. La chiave è tagliare la parte superiore e inferiore molto per eliminare lo spazio extra. Altro su Wikibooks .

Per gli output di immagini raster (ad es. Png), il seguente è nel mio Makefile:

 convert -trim input.png input-trimmed.png 

Ciò richiede imagemagick.

Aggiornamento: per tutte le mie pubblicazioni recenti ho utilizzato https://github.com/altmany/export_fig ed è la soluzione migliore che ho trovato finora (insieme a molte altre soluzioni ad altri problemi in un unico pacchetto). Sento uno strumento che è potente almeno quanto dovrebbe essere già una parte ufficiale di Matlab. Lo uso come:

 export_fig -transparent fig.pdf 

Quale esporta la figura attuale, ritagliando l’output per impostazione predefinita.

Richiede ghostcript

Nello scambio di file MATLAB ho trovato una funzione estremamente utile fornita da Jürg Schwizer:

 plot2svg( filename, figHandle ); 

Emette la figura come grafica vettoriale (.svg) e i singoli componenti della figura come grafica pixel (predefinito su .png). Ciò ti consente di fare ogni tipo di cose sulla tua figura (rimuovere etichette, spostare barre colorate, ecc.), Ma se sei interessato a rimuovere lo sfondo bianco, apri il file .svg con adkscape, separa gli elementi ed esporta oggetti che ti interessano come una nuova figura.

Per chi usa Linux una soluzione davvero semplice è scrivere in una shell: ps2pdf14 -dPDFSETTINGS=/prepress -dEPSCrop image.eps

Ho anche incontrato questo problema. Infine, ho usato il seguente metodo risolto che può salvare automaticamente una figura MATLAB come una dimensione pdf corretta.

puoi farlo in MATLAB attraverso:

 h = figure; % For example, h = openfig('sub_fig.fig'); Or you just ploted one figure: plot(1:10); set(h,'Units','Inches'); pos = get(h,'Position'); set(h,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[pos(3),pos(4)]); print(h,'your_filename','-dpdf','-r0'); 

Spero che sia d’aiuto.

Il metodo @ di Antonio mi è piaciuto al meglio ma ha lasciato troppi spazi bianchi, e stavo cercando una soluzione a trama singola che è stata esportata in PDF vettoriali per l’utilizzo in LaTeX.

  • Ho creato qualcosa in base al suo script e ho aggiunto l’opzione per esportare solo la casella del grafico (omettendo gli assi).

  • Nota che, a differenza della sceneggiatura di Antonio, questo funziona solo su figure senza sottotrame.

  • Il codice seguente esporterà qualsiasi figura di diagramma di trama singola come PDF vettoriale, con o senza assi.


 function SaveFigureAsVectorPDF(InputFigureHandle, OutFileName, ShouldPrintAxes) %% Check input parameters [NumberOfFigures, ~] = size(InputFigureHandle); if(NumberOfFigures ~= 1) error('This function only supports one figure handle.'); end if(isempty(OutFileName)) error('No file path provided to save the figure to.'); end cUnit = 'centimeters'; %% Copy the input figure so we can mess with it %Make a copy of the figure so we don't modify the properties of the %original. FigureHandleCopy = copy(InputFigureHandle); %NOTE: Do not set this figure to be invisible, for some bizarre reason % it must be visible otherwise Matlab will just ignore attempts % to set its properties. % % I would prefer it if the figure did not briefly flicker into % view but I am not sure how to prevent that. %% Find the axis handle ChildAxisHandles = get(FigureHandleCopy, 'Children'); NumberOfChildFigures = length(ChildAxisHandles); if(NumberOfChildFigures ~= 1) %note that every plot has at least one child figure error('This function currently only supports plots with one child figure.'); end AxisHandle = ChildAxisHandles(1); %% Set Units % It doesn't matter what unit you choose as long as it's the same for % the figure, axis, and paper. Note that 'PaperUnits' unfortunately % does not support 'pixels' units. set(FigureHandleCopy, 'PaperUnits', cUnit); set(FigureHandleCopy, 'Unit', cUnit); set(AxisHandle, 'Unit', cUnit); %% Get old axis position and inset offsets %Note that the axes and title are contained in the inset OldAxisPosition = get(AxisHandle, 'Position'); OldAxisInset = get(AxisHandle, 'TightInset'); OldAxisWidth = OldAxisPosition(3); OldAxisHeight = OldAxisPosition(4); OldAxisInsetLeft = OldAxisInset(1); OldAxisInsetBottom = OldAxisInset(2); OldAxisInsetRight = OldAxisInset(3); OldAxisInsetTop = OldAxisInset(4); %% Set positions and size of the figure and the Axis if(~ShouldPrintAxes) FigurePosition = [0.0, 0.0, OldAxisWidth, OldAxisHeight]; PaperSize = [OldAxisWidth, OldAxisHeight]; AxisPosition = FigurePosition; else WidthWithInset = OldAxisWidth + OldAxisInsetLeft + OldAxisInsetRight; HeightWithInset = OldAxisHeight + OldAxisInsetTop + OldAxisInsetBottom; FigurePosition = [0.0, 0.0, WidthWithInset, HeightWithInset]; PaperSize = [WidthWithInset, HeightWithInset]; AxisPosition = [OldAxisInsetLeft, OldAxisInsetBottom, OldAxisWidth, OldAxisHeight]; end set(FigureHandleCopy, 'Position', FigurePosition); set(AxisHandle, 'Position', AxisPosition); %Note: these properties do not effect the preview but they are % absolutely necessary for the pdf!! set(FigureHandleCopy, 'PaperSize', PaperSize); set(FigureHandleCopy, 'PaperPosition', FigurePosition); %% Write the figure to the PDF file print('-dpdf', OutFileName); set(FigureHandleCopy, 'name', 'PDF Figure Preview', 'numbertitle', 'off'); %If you want to see the figure (eg, for debugging purposes), comment %the line below out. close(FigureHandleCopy); end 

Immagini di esempio:

Con gli assi:

Screenshot PDF di esempio con assi

Senza assi:

Esempio di screenshot PDF senza assi

Codice di prova:

 %% Generates a graph and saves it to pdf FigureHandle = figure; plot(1:100); title('testing'); %with axes SaveFigureAsVectorPDF(FigureHandle, 'withaxes.pdf', true); %without axes SaveFigureAsVectorPDF(FigureHandle, 'withoutaxes.pdf', false); 

Questo funziona per scopi di visualizzazione:

 set(gca, 'LooseInset', get(gca, 'TightInset')); 

Dovrebbe funzionare anche per la stampa.

Puoi anche farlo in latex stesso.

  1. apri il file eps con notpad
  2. vai alla prima riga (%! PS-Adobe-3.1 EPSF- 3.0 )

Se l’ultimo numero è 3, cerca “rf” e poi commenta quella riga digitando % all’inizio della riga

altrimenti se l’ultimo numero è 2, cerca “pr” e poi commenta quella riga digitando % all’inizio della riga

Per gli utenti Linux, potrebbe essere d’aiuto il seguente comando

ps2epsi

come suggerito qui

e se si intende utilizzare in latex, usare il comando Latex \includegraphics* invece di \includegraphics

Il seguente approccio in 2 fasi ha funzionato per me (usando pdfcrop). Supponendo che tu abbia tutti gli strumenti pdf installati e PDFcrop ( http://pdfcrop.sourceforge.net/ )

In MATLAB, digita

 print -deps -r600 figure.eps 

E poi nella riga di comando

 ./cropEpsFigure.sh figure 

Utilizzando il seguente file: cropEpsFigure.sh

 #!/bin/bash /usr/texbin/epstopdf "$1.eps" /usr/texbin/pdfcrop "$1.pdf" /usr/local/bin/pdftops -eps "$1-crop.pdf"` 

salva la trama nel formato .eps in Matlab, quindi esegui il comando esptopdf sotto Linux. Questo non richiede alcuna codifica aggiuntiva. È necessaria solo una macchina Linux.

Puoi usare questo comando con Inkscape se hai pdf esistenti con spazi bianchi extra.

 Inkscape.exe --file SomePDFWithWhitespace.pdf --export-pdf=SomePDFWithWhitespaceRemoved.pdf --export-area-drawing 

Tuttavia, si noti che questo metodo lascia ancora degli spazi bianchi perché “l’area di disegno” della figura esportata stessa contiene degli spazi bianchi.

Di seguito sono riportati gli effetti dell’utilizzo di Inkscape:

Prima: (figura salvata usando File -> Salva come)

PDF salvato con File -/> Salva come”> </p>
<p>  Dopo: (usando Inkscape) </p>
<p> <img src=