MATLAB保存多个图形到PDF

7

有没有办法做到这一点?

我知道如何使用saveas(saveas(1,filename,'pdf');)将一个图保存为PDF文件,但是否可能添加多个?所以类似于(saveas(1,2,3)filename,'pdf');。

谢谢


可能可以使用hgsave来实现你想要的内容。 - Colin T Bowers
取消刚才的操作。hgsave 只能使用 .fig 扩展名工作。根据文档,它看起来可能可以使用其他文件类型,但在实际操作中并不行(至少在我的机器上 - 运行 R2012b 的 Linux Mint)。 - Colin T Bowers
5个回答

4

我认为你需要以某种方式增加文件名的编号。我建议使用类似以下格式的命名:

for ii=1:3
    saveas(ii,[filename '-' num2str(ii)],'pdf)
end

作为一个旁注,我在提交稿件时,将由Matlab生成的pdf文件包含进去时,遇到了多次困难。我的当前解决方案是生成eps文件并使用shell脚本进行转换。
r/

同意 (+1)。此外,我认为您可能会感兴趣知道:可以使用hgsave将多个图形保存到一个文件中。然而,据我所知,它仅适用于.fig扩展名。我已经添加了一个带有示例代码的答案,指出如何完成此操作。 - Colin T Bowers

3

MATLAB-PDFLaTeX解决方案

使用MATLAB的 publish 命令是一个很好的解决方案,正如其他答案所指出的那样。如果你想在不同图形的组合方面获得更多控制权,另一种解决方案是使用 pdflatex 将图像编译成单个PDF。

  1. 将图像打印到PDF中
  2. 生成包含图像的 LaTeX 代码
  3. 使用 PDFLaTeX 编译

下面是一个概念验证,它接受文件名作为 char 和一些 function_handle 数字,并生成一个包含这些图形的 PDF。

function res = save2pdf(name,varargin)
pathToPdflatex = '/Library/TeX/texbin/pdflatex' ; 

files = cell(size(varargin)) ;
for ii = 1:numel(varargin)
    files{ii} = sprintf('%s_fig%g.pdf',name,ii) ;
    print(varargin{ii},'-dpdf','-painters',files{ii}) ;
end

fh = fopen(sprintf('%s.tex',name),'w+') ;
fprintf(fh,'\\documentclass{article}\n') ;
fprintf(fh,'\\usepackage{graphicx}\n') ;
fprintf(fh,'\\begin{document}\n') ;
for ii = 1:numel(files)
    fprintf(fh,'\\includegraphics[width=\\textwidth]{%s}\n\\newpage\n',files{ii}) ;
end
fprintf(fh,'\\end{document}\n') ;
fclose(fh) ;

[~,res] = system(sprintf('%s %s.tex',pathToPdflatex,name)) ;
disp(res)
end

例子:

n = 1e+5 ;
x0 = cumsum(randn(n,1)) ;
x1 = cumsum(randn(n,1)) ;
f0 = figure() ;
f1 = figure() ;
ax0 = axes('Parent',f0) ;
ax1 = axes('Parent',f1) ;
plot(ax0,x0) ;
plot(ax1,x1) ;

save2pdf('my_figures',f0,f1)

voila:

...
Output written on my_figures.pdf (2 pages, 169718 bytes).
Transcript written on my_figures.log.

1
Matlab普遍存在的短板。好的解决方案。 - crowdedComputeeer
1
另一个选择是调用 matlab2tikz 并创建一个 *.tex tikz 图形,将其合并到文档中。如果您想要调整字体、颜色等,这个选项尤其有用。此外,Mathworks 现在建议使用 saveas 选项将图形合并到 Latex 文档中。如果您不想每个图形都在单独的页面上,这个选项也很有用。 - fukurai

3
我认为值得指出的是,您想要的行为可以通过使用 hgsavehgload 实现,但前提是您愿意使用 .fig 进行保存。这些函数的文档曾经误导了我一段时间,让我相信它们可以使用其他扩展名(例如 .pdf),但我无法在我的机器上(Linux Mint v12,Matlab r2012b)使示例正常工作。也许其他人能够做得更好。下面是一个使用 .fig 扩展名运行的示例:
%# Create some example data
x = (0:10)';
y1 = (1/10) * x;
y2 = sin(x);

%# Create an array of figures and an array of axes
AllFig(1) = figure('Visible', 'off');
AllFig(2) = figure('Visible', 'off');
AllAxes(1) = axes('Parent', AllFig(1));
AllAxes(2) = axes('Parent', AllFig(2));

%# Plot the data on the appropriate axes
plot(AllAxes(1), y1);
plot(AllAxes(2), y2);

%# Save both figures to .fig in one hit using hgsave
hgsave(AllFig, 'TwoFigsOneFile.fig');

% Clear the workspace
clear

%# Load both figures in one hit using hgload
LoadFig = hgload('TwoFigsOneFile.fig');

%# Display the first figure and second figure
figure(LoadFig(1));
figure(LoadFig(2));

我不知道这件事。我发现这非常强大。 - Derek

3
晚回复,但我想补充一下,您可以使用 publish 命令并发布为 pdf。创建一个名为“myfile.m”的 m 文件,并包含绘图命令,如下所示:
plot(x1,y1);
plot(x2,y2);

然后使用以下命令运行该文件:

publish('myfile.m', 'pdf')

这应该可以给你想要的东西。

0

没有内置命令可以将所有图形保存在一个PDF中,但有许多解决方法。

  1. 为每个图形创建PDF文件,并使用易于获得的软件将它们组合起来。

  2. 有一个名为Export_fig(http://www.mathworks.com/matlabcentral/fileexchange/23629)的脚本,可以将图形保存在单个PDF中。

  3. 将所有图形保存为.ps格式,然后将.ps转换为PDF(我发现这很容易使用)。 fname = 'test.ps'; print('-dpsc2', fname, '-f1') print('-dpsc2', fname, '-append', '-f2')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接