Me gustaría utilizar versiones en PDF de mi matlab parcelas en un documento LaTeX. Me estoy salvando las figuras usando el «guardar como» comando con la opción de PDF pero tengo un enorme espacio en blanco alrededor de mi parcelas en los archivos pdf. Es esto normal? ¿Cómo puedo deshacerme de él? Automáticamente, por supuesto, puesto que tienen «un montón» de las parcelas.

  • Misma pregunta: stackoverflow.com/questions/5150802/…
  • Tengo pdfcrop en mi flujo de trabajo para deshacerse de los espacios en blanco después del hecho. Ayuda con un montón de otros programas, así que la salida de documentos Pdf como lleno de hojas de papel.
  • Has llamado a soporte al cliente? Matlab es caro el software comercial, después de todo.
InformationsquelleAutor mjbrown2 | 2010-09-27

16 Comentarios

  1. 15

    La exportación de Figuras para su Publicación es un buen punto de partida. En lugar de -deps uso -dpdf para la salida en pdf.

    Usted puede fijar el cuadro delimitador problema utilizando el siguiente código.

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

    Usted puede leer más acerca de esto en De Tobin artículo.

  2. 8

    Las respuestas anteriores parece demasiado complicado. Esta función utiliza la figura de la manija y una cadena a imprimir el material en un archivo pdf sin los enormes márgenes.

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

    Por ejemplo, para imprimir la figura que se le puede llamar con:

    printpdf(gcf,'trash')

    Sin embargo, si usted realmente desea un pdf figura como una de Matlab generado eps, es decir, sólo las rectangular casco convexo de la trama (o un conjunto de tramas secundarias), aquí está la versión más sofisticada:

    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);
    • Para un ejemplo de cómo la representación de los pdf se diferencia entre estas dos funciones, por favor, ver a estos dos capturas de pantalla. Primer bloque de código, Segundo bloque de código (rectangular convex hull sólo). Nota cómo en la segunda imagen, la trama es arriba a la derecha contra la esquina inferior izquierda. Tenga en cuenta también que estos parecen ser verdaderas imágenes vectoriales (no raster), que para mí es lo que yo necesitaba, aunque me gustaría aún menos espacio en blanco. De todos modos gracias Antonio!
  3. 6

    He sufrido un poco con respecto a este b4 encontrar una respuesta fácil. Guardar como .eps y, a continuación, convertir el .eps a .pdf. En Mac OS esto se puede hacer en la vista previa.

  4. 4

    Acabo de pasar algún tiempo tratando de que la mayoría de estas opciones, pero mi amigo Espen señaló la más sencilla: si está usando el paquete graphicx en Látex, vaya con el estándar de Matlab pdf de salida y uso de la opción recorte en \includegraphics. Un ejemplo de un Proyector de diapositivas:

    \includegraphics[trim = 0,1 2,5 0,1 2,5, clip, scale=0.5]{matlabgraphic.pdf}

    La orden de ajuste de parámetros de aquí es de izquierda, abajo, derecha, arriba. La clave es recortar la parte superior y la inferior mucho para deshacerse del exceso de espacio. Más en Wikilibros.

  5. 4

    De imagen de trama de salidas (e.g png), el siguiente es en mi Makefile:

    convert -trim input.png input-trimmed.png

    Esto requiere de imagemagick.

    Actualización: Para todos mis publicaciones recientes he utilizado https://github.com/altmany/export_fig y es la mejor solución que he encontrado hasta el momento (junto con muchas otras soluciones a otros problemas en un solo paquete). Me siento una herramienta que es al menos tan potente como este ya debe ser parte oficial de Matlab. Yo lo uso como:

    export_fig -transparent fig.pdf

    Que las exportaciones de la Cifra actual, el recorte de la salida por defecto.

    Requieren ghostcript

  6. 2

    En MATLAB el intercambio de archivos he encontrado una muy útil función proporcionada por Jürg Schwizer:

    plot2svg( filename, figHandle );

    Salidas de la figura como un gráfico vectorial (.svg) y la cifra individual de los componentes como los gráficos de píxeles (el valor predeterminado .png). Esto le permite hacer todo tipo de cosas a su figura (quitar las etiquetas, mover las barras cromáticas, etc), pero si estás interesado en quitar el fondo blanco, sólo tienes que abrir el .archivo svg con, por ejemplo, inkscape, desagrupar los elementos y exportación de los artículos que usted está interesado en como una nueva figura.

  7. 2

    Para aquellos que utilizan linux realmente simple solución es escribir en un shell: ps2pdf14 -dPDFSETTINGS=/prepress -dEPSCrop image.eps

  8. 2

    También he encontrado con este problema. Por último, he utilizado el siguiente método de resolver que lo que puede salvar a uno de matlab figura automáticamente como una adecuada pdf tamaño.

    usted puede hacerlo en MATLAB a través de:

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

    Espero que ayude.

  9. 2

    Me gustó @Antonio del método de los mejores, pero todavía queda mucho espacio en blanco, y yo estaba buscando una única parcela de la solución que se exporta a vector de archivos pdf para su uso en el Látex.

    • Hice algo basado en su guión, y añadida la opción para exportar sólo la trama cuadro (la omisión de los ejes).

    • Tenga en cuenta que a diferencia de Antonio de la secuencia de comandos, esto sólo funciona en cifras sin subparcelas.

    • El código de abajo va a exportar cualquier parcela de la figura manejar como un vector de PDF, ya sea con o sin ejes.


    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 (e.g., for debugging purposes), comment
    %the line below out.
    close(FigureHandleCopy);
    end

    Imágenes de muestra:

    Con los ejes:

    Deshacerse de el espacio en blanco alrededor de matlab figura del pdf de salida

    Sin ejes:

    Deshacerse de el espacio en blanco alrededor de matlab figura del pdf de salida

    Código de prueba:

    %% 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);
    • Tenga en cuenta que las leyendas de las figuras cuentan como un «Niño» de la figura.
  10. 1

    Esto funciona para mostrar a los efectos de:

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

    Debe trabajar para la impresión.

    • No, no hay suerte: >> set(gca, ‘LooseInset’, get(gca, ‘TightInset’)); >> print(gcf, ‘-dpdf’, ‘mi figura.pdf’); >> print(gcf, ‘-dpng’, ‘mi figura.png’); no funciona
  11. 1

    También se puede hacer en látex de sí mismo.

    1. abrir el archivo eps con notpad
    2. ir a la primera línea (%!PS-Adobe-3.1 EPSF-3.0)

    Si el último número es el 3,
    la búsqueda «rf» y, a continuación, un comentario en esa línea escribiendo % al principio de la línea

    si por el contrario, el último número es 2,
    la búsqueda «pr» y, a continuación, un comentario en esa línea escribiendo % al principio de la línea

    • esto se ve como editar el archivo de imagen raw, más que nada para hacer con látex? También puede ser que desee para indicar que el % es un comentario en PS (AFAIR)
  12. 1

    Para los usuarios de Linux el comando siguiente podría ayudar a

    ps2epsi <input.eps> <output.eps>

    como se sugiere aquí

    y si tiene la intención de utilizar en el látex, el uso de Látex comando \includegraphics* en lugar de \includegraphics

    • ¿cómo ayuda con archivos Pdf?
  13. 0

    Los siguientes 2 pasos que trabajó para mí (utilizando pdfcrop). Asumiendo que usted tiene todos los pdf-tools instalado y PDFcrop (http://pdfcrop.sourceforge.net/)

    En MATLAB, tipo

    print -deps -r600 figure.eps

    Y, a continuación, en la línea de comandos

    ./cropEpsFigure.sh figure

    Utilizar el siguiente archivo: cropEpsFigure.sh

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

    guardar el gráfico en .formato eps en Matlab, a continuación, ejecutar esptopdf de comandos en Linux. Esto no requiere ninguna codificación adicional. Sólo una máquina Linux es necesario.

  15. -2

    Puede utilizar este comando con Inkscape si usted tiene los pdfs existentes, con un espacio en blanco adicional.

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

    Obstante, tenga en cuenta que este método todavía deja algunos espacios en blanco debido a que el «área de dibujo» de la exportado figura en sí misma contiene algún espacio en blanco.

    Los efectos del uso de Inkscape se muestra a continuación:

    Antes: (figura guardado usando Archivo -> Guardar Como)

    Deshacerse de el espacio en blanco alrededor de matlab figura del pdf de salida

    Después de: (usando Inkscape)

    Deshacerse de el espacio en blanco alrededor de matlab figura del pdf de salida

    • Es posible que desee incluir la real de comandos necesarios al responder a una pregunta.
    • Realmente me gusta esta solución, pero no podía encontrarlo.. Si alguien lo sabe, por favor, publicarlo.
    • Este comando hará, aunque se nota que se sale un poco de los espacios en blanco innecesarios: Inkscape.exe --file SomePDFWithWhitespace.pdf --export-pdf=SomePDFWithWhitespaceRemoved.pdf --export-area-drawing

Dejar respuesta

Please enter your comment!
Please enter your name here