MATLAB 绘图在内部被描述为矢量图形,PDF 文件也使用矢量图形来描述。将绘图渲染为光栅格式不是一个好主意,因为您最终不得不选择分辨率并最终得到更大的文件。
只需将绘图保存为EPS格式,即可使用latex
. 我通常使用以下方法保存我的 MATLAB 图以供发布:
saveas(gcf, 'plot.eps', 'epsc');
并使用以下命令将它们直接嵌入到我的乳胶文件中:
\includegraphics[width=0.7\linewidth]{plot.eps}
然后,您只需要选择图像要拍摄的线条比例(在本例中为 70%)。
编辑:IrfanView 和其他(XnView)不能很好地显示 EPS。您可以在 Adobe Illustrator 中打开它们以获得更好的预览效果。我总是以这种方式插入我的图,它们在 PDF 中的外观与在 MATLAB 中的外观完全相同。
使用 EPS 还可以获得的一个好处是,您实际上可以指定字体大小,以便即使您调整文档中图像的大小,文本也可以阅读。
至于刻度的数量,您可以查看 MATLAB 文档中的轴属性。特别是,XTick
无论YTick
窗口分辨率是多少,手动控制出现的刻度数非常有用。
编辑(再次):如果您将图像渲染为光栅格式(例如 PNG),最好选择与文档中使用的分辨率完全相同的分辨率。渲染大图像(通过使用大窗口大小)并在 PDF 中使其变小会产生不好的结果,主要是因为文本的大小将直接随图像大小缩放。由于拉伸,渲染小图像显然会产生非常糟糕的效果。
这就是为什么您应该使用矢量图像格式。但是,图形的默认 MATLAB 设置会产生一些与光栅图像相同的问题:文本大小未指定为字体大小,并且刻度数随窗口大小而变化。
要在最终渲染中生成最佳绘图,请按照给定的步骤操作:
- 将图形的字体大小设置为合适的设置(例如 11pt)
- 渲染情节
- 确定刻度数以获得良好效果并手动设置刻度
- 将图像渲染为彩色 EPS
在 MATLAB 代码中,这应该类似于以下内容:
function [] = nice_figure ( render )
%
% invisible figure, good for batch renders.
f = figure('Visible', 'Off');
% make plots look nice in output PDF.
set(f, ...
'DefaultAxesFontSize', 11, ...
'DefaultAxesLineWidth', 0.7, ...
'DefaultLineLineWidth', 0.8, ...
'DefaultPatchLineWidth', 0.7);
% actual plot to render.
a = axes('Parent', f);
% show whatever it is we need to show.
render(a);
% save file.
saveas(f, 'plot.eps', 'epsc');
% collect garbarge.
close(f);
end
然后,您可以使用以下方法绘制一些精美的情节:
function [] = some_line_plot ( a )
%
% render data.
x = -3 : 0.001 : +3;
y = expm1(x) - x - x.^2;
plot(a, x, y, 'g:');
title('f(x)=e^x-1-x-x^2');
xlabel('x');
ylabel('f(x)');
% force use of 'n' ticks.
n = 5;
xlimit = get(a, 'XLim');
ylimit = get(a, 'YLim');
xticks = linspace(xlimit(1), xlimit(2), n);
yticks = linspace(ylimit(1), ylimit(2), n);
set(a, 'XTick', xticks);
set(a, 'YTick', yticks);
end
并使用以下方法渲染最终输出:
nice_figure(@some_line_plot);
使用这样的代码,您根本不需要担心窗口大小。请注意,我什至没有显示窗口供您使用它的大小。使用这段代码,我总能得到漂亮的输出和小的 EPS 和 PDF 文件大小(比使用 PNG 时小得多)。
该解决方案唯一没有解决的问题是当乳胶代码中的绘图变大时添加更多的刻度,但这无论如何都无法完成。