matlab保存高清图片png、svg、pdf等

在实际的使用过程中不同场景常常需要不同的图片格式。
如果直接在图窗中导出当然可以,但一个一个的导出有些麻烦,最方便的还是写成代码。

对于2020a及以后的版本,请使用exportgraphics函数。太强大了!
对于之前的版本,只能使用saveas和print函数。

关于gca和gcf

gca对应的是坐标(axis),gcf对应的图窗(figure),但一般而言似乎没什么区别。出现区别应该是对那种具有超出坐标区边界的注释的绘图而言的,比如下面这种。
matlab保存高清图片png、svg、pdf等_第1张图片

保存路径的问题

如果不设置路径的话就保存在当前目录下了,一般而言会有些乱,这时应用相对路径会方便的多。

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中也被裁了一块,不知道原因何在。
matlab保存高清图片png、svg、pdf等_第2张图片
exportgraphics函数似乎只支持emf不支持svg?在官方文档中没看到svg。

导出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函数。

参考链接

  • https://zhuanlan.zhihu.com/p/268806430
  • https://zhuanlan.zhihu.com/p/259992634
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图片

你可能感兴趣的:(matlab,可视化,matlab)