目录
- 前言
- 设置次刻度线数量函数
- 示例
- 基本绘图
- 设置次刻度线数量函数的使用
- 设置刻度线的长度
- 设置刻度线和轴线的宽度
- 总代码
- 总结
前言
在MATLAB中,将XMinorTicktrue或者YMinorTicktrue设置为true可以很方便地设置X轴或者Y轴次刻度线,但是次刻度线的数量是MATLAB自适应设置的,无法直接进行修改。在本文章中,提供了一个直接设置X轴或者Y轴次刻度线数量的函数,并提供了函数的使用示例。此外,还对刻度线的宽度(粗细)和长度进行了设置。
设置次刻度线数量函数
设置次刻度线数量函数setMinorTick如下,该函数必须输入一个窗口对象ax,ax通常可以赋值为gca;N表示设置的次刻度线数量,默认为4;XYAxis表示设置的坐标轴(XY轴:0;X轴:1;Y轴:2),默认为0,即同时设置X轴和Y轴。
function setMinorTick(ax, N, XYAxis)
% 设置次刻度线数量
% ax 需要设置的绘图对象, 通常为ax = gca
% N 次刻度线的数量 默认:4
% XYAxis 设置的坐标轴(XY轴:0 X轴:1 Y轴:2) 默认:X轴和Y轴
if nargin < 2, N = 4; end
if nargin < 3, XYAxis = 0; end
% 设置X轴的次刻度线
if XYAxis == 0 || XYAxis == 1
set(ax,'XMinorTick',true) % 开启X轴的次刻度线
% 当前次刻度线的最小和最大值
XAxis_min = min(get(ax.XAxis,'TickValues'));
XAxis_max = max(get(ax.XAxis,'TickValues'));
% 当前主刻度线的数量
XAxis_N = length(get(ax.XAxis,'TickValues'));
% 计算新刻度线的间隔
XAxis_space = (XAxis_max-XAxis_min)/((XAxis_N-1)*(N+1));
% 设置新刻度线
ax.XAxis.MinorTickValues = XAxis_min:XAxis_space:XAxis_max;
end
% 设置Y轴的次刻度线
if XYAxis == 0 || XYAxis == 2
set(ax,'YMinorTick',true)
YAxis_min = min(get(ax.YAxis,'TickValues'));
YAxis_max = max(get(ax.YAxis,'TickValues'));
YAxis_N = length(get(ax.YAxis,'TickValues'));
YAxis_space = (YAxis_max-YAxis_min)/((YAxis_N-1)*(N+1));
ax.YAxis.MinorTickValues = YAxis_min:YAxis_space:YAxis_max;
end
end
示例
基本绘图
下面这是基本的绘图代码,具体细节可以参考前面的文章(点击转跳)。
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);
ax = gca; % 将当前坐标区实例化
plot(x,y,'-k',x,y1,'ok','LineWidth',1.3)
hold on
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 = 'none';
le.Color = 'none';
le.LineWidth = 1.3;
% 设置次刻度线
set(gca,'XMinorTick',true)
set(gca,'YMinorTick',true)
% 去除上边框、右边框刻度线
box off % 取消边框
ax1 = axes('Position',get(ax,'Position'),'XAxisLocation','top',...
'YAxisLocation','right','Color','none','XColor','k','YColor','k'); % 设置坐标区
set(ax1,'XTick', [],'YTick', []); % 去掉xy轴刻度
hold off
运行代码后得到下面的结果图。可以看到,通过set(gca,‘XMinorTick’,true)和set(gca,‘YMinorTick’,true)后已经有次刻度线了,但是无法设置次刻度线的数量。
设置次刻度线数量函数的使用
可以将set(gca,‘XMinorTick’,true)和set(gca,‘YMinorTick’,true)删除(其实不删也行),接着调用setMinorTick对次刻度线进行设置,注意ax在前面已经赋值了,见上一个代码块。
- 对X轴和Y轴设置数量为4的次刻度线
% 设置次刻度线
% set(gca,'XMinorTick',true)
% set(gca,'YMinorTick',true)
setMinorTick(ax,4)
或者
% 设置次刻度线
setMinorTick(ax,4,0)
运行结果图如下,可以看到X轴和Y轴的次刻度线数量已经变为4了。
- 对X轴设置数量为4的次刻度线
setMinorTick(ax,4,0)
- 对Y轴设置数量为4的次刻度线
setMinorTick(ax,4,2)
- 设置其他数量的次刻度线
同样还可以设置任意数量(大于0)的刻度线,比如1、2、3…
setMinorTick(ax,1,0)
setMinorTick(ax,2,0)
setMinorTick(ax,3,0)
设置刻度线的长度
设置刻度线的长度可以直接通过TickLength属性进行设置。对于TickLength属性的MATLAB文档解释如下:
- 刻度线长度,指定为 [2Dlength 3Dlength]形式的二元素向量。第一个元素是二维视图中的刻度线长度,第二个元素是三维视图中的刻度线长度。指定值是以可见的 x 轴、y 轴或 z轴中最长线条为基准进行归一化的值。
通俗来说就是第一个值设置二维刻度线长度,第二个值设置三维刻度线的长度。例如下面的代码中设置的二维刻度线的长度为0.015,后面的0.35是三维刻度线的长度(二维图形不用管0.35这个值,随便给,只要合理就行)。
set(ax,'TickLength',[0.015, 0.035])
或者
set(gca,'TickLength',[0.015, 0.035])
对刻度线长度进行了设置后得到下面的结果图。可以看到,当前的刻度线长度明显比之前的刻度线长度长了。(注:默认的刻度线长度为0.01)
设置刻度线和轴线的宽度
设置刻度线和轴线的宽度很简单,只需要对lineWidth属性重新赋值即可,下面的代码将刻度线和轴线的宽度设置为1。(注:默认的宽度为0.5)
set(ax,'lineWidth',1)
或者
set(gca,'lineWidth',1)
设置了刻度线和轴线的宽度后,上、右边框的宽度没有发生改变,这是因为去除上、右边框刻度线时重新设置了一个新的绘图区,对新绘图区的轴线宽度也要进行修改。在原本去除上、右边框刻度线的代码后面加入如下代码,注意此时的图对象为ax1,不是ax!
% 去除上边框、右边框刻度线
box off % 取消边框
ax1 = axes('Position',get(ax,'Position'),'XAxisLocation','top',...
'YAxisLocation','right','Color','none','XColor','k','YColor','k'); % 设置坐标区
set(ax1,'XTick', [],'YTick', []); % 去掉xy轴刻度
hold off
% 修改新绘图区的轴线宽度
set(ax1,'lineWidth',1)
运行结果图如下:
总代码
总代码如下,后续还会继续更新一些MATLAB绘图的技巧和细节,制作不易,别忘了关注和点赞喔。
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);
ax = gca; % 将当前坐标区实例化
plot(x,y,'-k',x,y1,'ok','LineWidth',1.3)
hold on
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 = 'none';
le.Color = 'none';
le.LineWidth = 1.3;
% 设置次刻度线
% % set(gca,'XMinorTick',true)
% % set(gca,'YMinorTick',true)
setMinorTick(ax,4) % 对X轴和Y轴设置数量为4的次刻度线
% setMinorTick(ax,4,0) % 对X轴和Y轴设置数量为4的次刻度线
% setMinorTick(ax,4,1) % 对X轴设置数量为4的次刻度线
% setMinorTick(ax,4,2) % 对Y轴设置数量为4的次刻度线
% setMinorTick(ax,1,0) % 对X轴和Y轴设置数量为1的次刻度线
% setMinorTick(ax,2,0) % 对X轴和Y轴设置数量为2的次刻度线
% setMinorTick(ax,3,0) % 对X轴和Y轴设置数量为3的次刻度线
% 设置刻度线的长度
set(ax,'TickLength',[0.015, 0.035])
% 设置坐标轴的粗细
set(ax,'lineWidth',1)
% 去除上边框、右边框刻度线
box off % 取消边框
ax1 = axes('Position',get(ax,'Position'),'XAxisLocation','top',...
'YAxisLocation','right','Color','none','XColor','k','YColor','k'); % 设置坐标区
set(ax1,'XTick', [],'YTick', []); % 去掉xy轴刻度
hold off
% 修改新绘图区的轴线宽度
set(ax1,'lineWidth',1)
% 保存图片
print(f,'-dpng','FigName','-r600')%保存图像
function setMinorTick(ax, N, XYAxis)
% 设置次刻度线数量
% ax 需要设置的绘图对象, 通常为ax = gca
% N 次刻度线的数量 默认:4
% XYAxis 设置的坐标轴(XY轴:0 X轴:1 Y轴:2) 默认:X轴和Y轴
if nargin < 2, N = 4; end
if nargin < 3, XYAxis = 0; end
% 设置X轴的次刻度线
if XYAxis == 0 || XYAxis == 1
set(ax,'XMinorTick',true) % 开启X轴的次刻度线
% 当前次刻度线的最小和最大值
XAxis_min = min(get(ax.XAxis,'TickValues'));
XAxis_max = max(get(ax.XAxis,'TickValues'));
% 当前主刻度线的数量
XAxis_N = length(get(ax.XAxis,'TickValues'));
% 计算新刻度线的间隔
XAxis_space = (XAxis_max-XAxis_min)/((XAxis_N-1)*(N+1));
% 设置新刻度线
ax.XAxis.MinorTickValues = XAxis_min:XAxis_space:XAxis_max;
end
% 设置Y轴的次刻度线
if XYAxis == 0 || XYAxis == 2
set(ax,'YMinorTick',true)
YAxis_min = min(get(ax.YAxis,'TickValues'));
YAxis_max = max(get(ax.YAxis,'TickValues'));
YAxis_N = length(get(ax.YAxis,'TickValues'));
YAxis_space = (YAxis_max-YAxis_min)/((YAxis_N-1)*(N+1));
ax.YAxis.MinorTickValues = YAxis_min:YAxis_space:YAxis_max;
end
end
总结
这只是一个基础的示例,实际中还会有更具体的、更细致的要求,这就需要再做额外调整;另外本人也仍在学习中,这只是个人的学习笔记,可能还有一些不足之处,欢迎指正。