目录
前言
这是本人在学习MATLAB中的一些笔记,可能许多不足之处,欢迎批评指正。
绘图
MATLAB的绘图命令为plot,并且可以设置坐标标题(xlabel,ylabel),设置图例(legend)以及图标题(title)。
一般来说,对于理工类的绘图是不需要title的,而title应该在写文章时放在图片的正下方(详情见论文规范)。
下面给出这些命令的相关用法:
一般在写MATLAB脚本时,在前面加上这个语句,清除所有的工作区变量、命令行内容和关闭所有图片:
clc;clear;close all
下面模拟一些数据:
x = 0:0.01:1; % 产生0到1, 步长为0.01的序列
y = 2*x + 1; % y为x一次函数
rng(100) % 随机数种子,使每次随机数都是一样的
r = (rand(1,length(x)) - 0.5) * 2; %产生-1到1的随机数
y1 = y + r*0.5; %对y施加扰动(为了模拟数据)
plot函数绘图:
下面这两种方式是等价的,f = figure(1)是表示当前图为第一个图,类似的可以有 figure(2), figure(3)…(绘图习惯)
- 方式1
f = figure(1);
plot(x,y,x,y1)
- 方式2
f = figure(1);
plot(x,y)
hold on
plot(x,y1)
可以得到下图
添加轴标题,图例,比如x轴为位移,y轴为力:
xlabel('位移 x/mm')
ylabel('力 y/N')
legend('拟合数据','原始数据')
全局字体字号
对于大多数的论文要求,中文为宋体,英文字体为Times New Roman,这时就需要对原始绘图命令进行修改。
设置全局字体、字号,其中gca为当前绘图区,下面该语句的意思是:将当前绘图区的字体和字号设置为Times New Roman和13号。
set(gca,'FontName','Times New Roman','FontSize',13)
这时候发现标签、坐标轴标题的字体不显示了,这是因为Times New Roman没有中文字体的原因,因此需要单独对局部的字体进行设置。
局部字体字号
这直接在xlabel、ylabel、length后面修改就行,这里最好写在设置全局字体的后面,具体原因可以自己去尝试一下有什么不同。
xlabel('位移 x/mm','FontName','宋体')
ylabel('力 y/N','FontName','宋体')
legend('拟合数据','原始数据','FontName','宋体')
到这里又会发现,xlabel、ylabel的英文也跟着变成宋体了。对于中英文混合的,可以直接在段落中进行设置,格式为 \fontname{字体名字} xxx,注意xxx包括后面所有的文字、字母、数字、符号等。
xlabel('\fontname{宋体} 位移 \fontname{Times New Roman} x/mm')
ylabel('\fontname{宋体} 力 \fontname{Times New Roman} y/N')
再设置一下斜体\it xxx,或者设置正体\rm xxx,注意这里xxx同样包括后面所有的文字、字母、数字、符号等。
xlabel('\fontname{宋体} 位移 \fontname{Times New Roman} \it x/\rm mm')
ylabel('\fontname{宋体} 力 \fontname{Times New Roman} \it y/\rm N')
修改线型样式、调整图例
下面再针对线型进行调整,直接在plot函数里加就行(更多的线型、标记符号自行查看plot帮助文档)
plot(x,y,'-k',x,y1,'ok','LineWidth',1.3)
再调整一下图例位置(直接在legend上修改),并且将图例边框取消
legend('拟合数据','原始数据','FontName','宋体','Location','northwest')
legend('boxoff') %取消图例边框
加网格线、次刻度线
添加网格线
grid on % 添加网格线
ax = gca; % 将当前坐标区实例化
ax.GridLineStyle = '--'; % 设置网格线样式
ax.GridColor = [0.5,0.5,0.5]; % 设置颜色
ax.GridAlpha = 0.5; % 设置透明度
添加次刻度线
set(gca,'XMinorTick',true)
set(gca,'YMinorTick',true)
细节调整
去除上边框、右边框刻度线
可以看到上框线和右框线也出现了刻度,有时候是我们不想要的,但MATLAB目前又没有办法直接设置,为此我们可以用一个新的坐标区去代替上、右框线。
实现过程如下:
box off % 取消边框
ax1 = axes('Position',get(gca,'Position'),'XAxisLocation','top',...
'YAxisLocation','right','Color','none','XColor','k','YColor','k'); % 设置坐标区
set(ax1,'XTick', [],'YTick', []); % 去掉xy轴刻度
hold off
效果图
需要注意的地方
如果将绘制的点修改为彩色点,会导致最右侧的点被右框线覆盖一部分。
% 将plot(x,y,'-k',x,y1,'ok','LineWidth',1.3)修改成了下面的彩色点
plot(x,y,'-k',x,y1,'or','MarkerFaceColor','r','LineWidth',1.3)
解决办法请参考下面这篇文章——>点击转跳<——
修改成白色背景
周围的灰色的部分,可以改成白色
set(0,'defaultfigurecolor','w');
隐藏图例背后的刻度线
有时候我们希望将图例的背景网格线隐藏,这时可以将将图例边框重新打开(前面legend(‘boxoff’)关闭了),然后将边框颜色改成白色就可以了
le = legend('拟合数据','原始数据','FontName','宋体','Location','northwest');
le.EdgeColor = 'w';
le.LineWidth = 1.3;
保存图片
绘图好后需要将图片按一定的分辨率进行保存,下面提供了两种方法对图片进行保存。
print函数带白边保存
print函数中,f为当前图的实例对象( 就是前面定义了f=figure(1)中的f ),当然还有其他的输入格式(见帮助文档);‘-djpeg’为图片格式为.jpg,’-dpng’对应图片格式为.png;‘Infww’为文件名字,当然也可以取别的名字;’-r600’表示图片分辨率为600dpi。
print(f,'-djpeg','Infww','-r600')%保存图像
红色的边框为保存图片时的边界,实际保存的时候是没有这个红色边框的,这里只是起到一个说明的作用。
exportgraphics函数删除白边保存
exportgraphics函数可以将白边尽可能的去除,f与print函数中f的意义一样,也是当前图的实例;‘Infww.png’,表示文件名加图片后缀;‘Resolution’,600 设置分辨率为600dpi。
exportgraphics(f,'Infww.png', 'Resolution',600)
红色的边框为保存图片时的边界,实际保存的时候是没有这个红色边框的,这里只是起到一个说明的作用。
总代码
clc;clear;close all
set(0,'defaultfigurecolor','w');
%% 数据
x = 0:0.01:1; % 产生0到1, 步长为0.01的序列
y = 2*x + 1; % y为x一次函数
rng(100) % 随机数种子,使每次随机数都是一样的
r = (rand(1,length(x)) - 0.5) * 2; %产生-1到1的随机数
y1 = y + r*0.5; %对y施加扰动(为了模拟数据)
%% 绘图
f = figure(1);
plot(x,y,'-k',x,y1,'ok','LineWidth',1.3)
% plot(x,y)
% hold on
% plot(x,y1)
%
set(gca,'FontName','Times New Roman','FontSize',13)
xlabel('\fontname{宋体} 位移\fontname{Times New Roman} \it x/\rm mm')
ylabel('\fontname{宋体} 力\fontname{Times New Roman} \it y/\rm N')
% 图例
le = legend('拟合数据','原始数据','FontName','宋体','Location','northwest');
% legend('boxoff') %取消图例边框
le.EdgeColor = 'w';
le.LineWidth = 1.3;
% 设置网格线
grid on % 添加网格线
ax = gca; % 将当前坐标区实例化
ax.GridLineStyle = '--'; % 设置网格线样式
ax.GridColor = [0.5,0.5,0.5]; % 设置颜色
ax.GridAlpha = 0.5; % 设置透明度
% 设置次刻度线
set(gca,'XMinorTick',true)
set(gca,'YMinorTick',true)
% 去除上边框、右边框刻度线
box off % 取消边框
ax1 = axes('Position',get(gca,'Position'),'XAxisLocation','top',...
'YAxisLocation','right','Color','none','XColor','k','YColor','k'); % 设置坐标区
set(ax1,'XTick', [],'YTick', []); % 去掉xy轴刻度
hold off
% 保存图片
print(f,'-djpeg','Infww','-r600')%保存图像
exportgraphics(f,'Infww.png', 'Resolution',600)
总结
这只是一个基础的示例,实际中还会有更具体的、更细致的要求,这就需要再做额外调整;另外本人也仍在学习中,这只是个人的学习笔记,可能还有一些不足之处,欢迎指正。