在实际的使用过程中不同场景常常需要不同的图片格式。
如果直接在图窗中导出当然可以,但一个一个的导出有些麻烦,最方便的还是写成代码。
对于2020a及以后的版本,请使用exportgraphics函数。太强大了!
对于之前的版本,只能使用saveas和print函数。
关于gca和gcf
gca对应的是坐标(axis),gcf对应的图窗(figure),但一般而言似乎没什么区别。出现区别应该是对那种具有超出坐标区边界的注释的绘图而言的,比如下面这种。
保存路径的问题
如果不设置路径的话就保存在当前目录下了,一般而言会有些乱,这时应用相对路径会方便的多。
x = [2 4 7 2 4 5 2 5 1 4];
bar(x);
saveas(gcf,'.\figures\Barchart.png')
导出png
png应该是最通用的一种格式了,虽然不是矢量图但一般情况下600dpi的png也足够用了。
一般而言saveas函数支持的格式足够多了,但对非矢量图而言似乎不能直接在代码中设置分别率
可参考链接 https://blog.csdn.net/u014636245/article/details/83010659
有时候对于导出分辨率不满足要求,还可以利用matlab 的 print 函数来进行导出。
%在做好图后,fig显示当前需要保存的图像
img =gcf; %获取当前画图的句柄
print(img, '-dpng', '-r600', './img.png') %即可得到对应格式和期望dpi的图像
%第一个参数为fig的句柄,第二个-r后加对应的分辨率dpi,第二个为-d加对应的图像格式
%最后加上文件路径及名称字符串。
%https://edoras.sdsu.edu/doc/matlab/techdoc/ref/print.html
%http://cens.ioc.ee/local/man/matlab/techdoc/ref/print.html
%http://ww2.mathworks.cn/help/matlab/ref/print.html
此外对于图像,还可以使用imwrite:
img = getimage(gcf); %获取当前坐标系图像
imwrite(img,‘img.tiff’, ‘tiff’, ‘Resolution’, 600) %只有tiff可以使用Resolution参数, png可以使用X/YResolution, 参考help imwrite
导出emf或svg
直接使用saveas是可以的,但不知道为什么自己导出的svg图片在裁剪上似乎有问题。
导出的emf图片在Ai里看着是好好的,导入到Word中也被裁了一块,不知道原因何在。
exportgraphics函数似乎只支持emf不支持svg?在官方文档中没看到svg。
如果是在latex中使用,用exportgraphics函数导出.pdf或.eps文件是最合适的。但如果是在Word中想插入矢量图,那么就要选择 emf 或 svg了。
但有时svg会有上述显示不全的问题,而且还不能用exportgraphics函数导出,所以似乎选用emf是最好的选择。
1、Word转pdf时的bug
但是自己在使用时emf图片插入Word后,如果用Acrobat生成pdf会出现图片坐标轴刻度变小的情况
解决方案有以下几个:
1、全部采用600dpi的 png 图片。如果用 Acrobat 生成pdf则没问题,如果是用Word另存为还要注意在保存时设置避免图片压缩。
2、确保文中全都是 svg 或 emf 的矢量图,然后用 Word 自带的另存为,不要用Acrobat。如果其中有的图是png,则一定要设置避免图片压缩
3、使用Acrobat的高质量打印,可参考如下链接
https://zhuanlan.zhihu.com/p/341224638
但生成的pdf可能会很大。
4、使用saveas保存为svg,但设置图窗大小,也就是把图窗和坐标轴的大小都固定。这对于学位论文而言可能是最合适的。
2、将三维bar图保存为emf时分辨率很低
参考以下文章
https://blog.csdn.net/weixin_42998214/article/details/121330600
采用的方法是在保存前加一行代码:
set(gcf,'renderer','painters');
对于向量图,matlab的saveas函数的帮助文档中有这样一段话,是可能有用的:
向量图形文件存储用于重新绘制图窗的命令。这种格式类型适合缩放,但可能导致文件较大。在某些情况下,向量图形格式可能产生三维排列有误的对象。某些应用程序支持对向量图形格式进行大量编辑,但是某些应用程序不支持调整图形大小以外的编辑。最佳做法是在图窗仍处于 MATLAB 中时进行所有必要的更改。
通常,生成向量图形文件时,saveas 会使用 Painters 渲染器。对于一些复杂图窗,saveas 会改用 OpenGL® 渲染器。如果它使用 OpenGL 渲染器,则向量图形文件会包含嵌入式图像,这可能会限制您可在其他应用程序中编辑该图像的程度。此外,如果 saveas 使用 OpenGL 渲染器生成文件,则不支持透明度。要确保 saveas 使用 Painters 渲染器,请将图窗的 Renderer 属性设置为 ‘painters’。
如果设置了图窗的 Renderer 属性,则 saveas 将会使用该渲染器。否则,它会选择合适的渲染器。但是,如果 saveas 选择的渲染器与显示的图窗所用的渲染器不同,则所保存图窗的一些细节与显示的图窗可能有所不同。如果需要,您可以通过设置图窗的 Renderer 属性使显示的图窗和保存的图窗使用同一渲染器。
导出PDF
导出为pdf主要是为了插入LaTeX方便。
2020a以前版本
如果是2020a以前的版本,在保存是往往会出现整页只有一张图而大片空白的情况,这个时候没有太好的办法,后期裁剪毕竟麻烦。下面贴两个代码做权宜之计,之所以称其为权宜之计是因为生成的图片还是空白太多,应该和fig的papersize等属性有关,怎么修改没搞清楚。参考链接 https://www.mathworks.com/matlabcentral/answers/12987-how-to-save-a-matlab-graphic-in-a-right-size-pdf
% 示例1
h = 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,'filename','-dpdf','-r0')
% 示例2
%% Crop and save MatLAB figure as PDF
function savePDF(plot_path,plot_name)
% check if directory exists, if not create one
if ~exist(plot_path, 'dir')
mkdir(plot_path)
end
fig = gcf;
fig.PaperPositionMode = 'auto';
fig_pos = fig.PaperPosition;
fig.PaperSize = [fig_pos(3) fig_pos(4)];
print(fig,'-dpdf','-painters','-r600','-bestfit',strcat(plot_path,plot_name));
end
2020a及以后版本
如果是2020a及以后的版本,使用exportgraphics函数。
参考链接
x = linspace(-2*pi,2*pi);
y1 = sin(x);
y2 = cos(x);
p1 = plot(x,y1,'->','MarkerIndices',1:3:length(y1));%每3个数据点标记一次
hold on
p2 = plot(x,y2,'-o','MarkerIndices',1:3:length(y2));%每3个数据点标记一次
p1(1).LineWidth = 2;%设置第一个线条的线宽为2磅
p2(1).LineWidth = 2;%设置第二个线条的线宽为2磅
p1(1).Color = [0.894117647058824 0.121568627450980 0.149019607843137];%对颜色进行设置
p2(1).Color = [0.192156862745098 0.498039215686275 0.717647058823529];%对颜色进行设置
ax = gca;
ax.XLabel.String = 'Time (\circC)';
ax.XLabel.FontSize = 12;
ax.XLabel.FontName = 'Arial';
ax.YLabel.String = 'Amplitude';
ax.YLabel.FontSize = 12;
ax.YLabel.FontName = 'Arial';
ax.YTick = -1.5:0.5:1.5;
ax.XTick = -2*pi:pi:2*pi;
ax.XTickLabel = {'-2\pi','-\pi','0','\pi','2\pi'};
ax.XLim = [-2*pi 2*pi];
ax.YLim = [-1.5 1.5];
ax.FontSize = 12;
ax.FontName = 'Arial';
lgd = legend('\it{P}_{\rm{ev}}\rm =100kPa','\it{P}_{\rm{ev}}\rm =200kPa');
lgd.NumColumns = 2;
lgd.Box = 'off';
lgd.FontSize = 12;
lgd.FontName = 'Arial';
%设置画布的大小以及在屏幕中间 位置
set(gcf,'Units','centimeters','Position',[1.4 10 16 10.5])
%设置坐标区图的大小和位置
set(gca,'Units','centimeters','Position',[2 1.2 12 9])
exportgraphics(gcf,'peaks.png','Resolution',300);%输出分辨率为300的PNG图片
exportgraphics(gcf,'peaks.pdf','ContentType','vector');%输出矢量pdf图片
exportgraphics(gcf,'peaks.eps');%输出矢量eps图片