目录
前言
最终能达到的效果图
1.绘制带箭头的对象
核心函数:annotation
annotation('arrow',x,y)%建立从(x(1), y(1))到(x(2), y(2))的箭头注释对象
例:建立从(0,0)到(1,1)的箭头注释对象
figure()
annotation('arrow',[0 1],[0 1]);
从图像可以看出来,这里的坐标参数并不是坐标轴上的x和y坐标,而是相对于整个figure对象的标准化坐标,取值范围[0,1]。
那么我们需要先找到x轴、y轴所对应的标准化坐标。
2.找到x轴、y轴所对应的标准化坐标
核心函数:gca、get、set
函数名 | 说明 | 语法 |
---|---|---|
gca() | 当前坐标区或图 | ax = gca |
get() | 查询图形对象属性 | v = get(h,propertyName) |
set() | 设置图形对象属性 | set(H,Name,Value) |
例:输出当前坐标区对象的所有属性
gca
ans =
Axes - 属性:
XLim: [0 1]
YLim: [0 1]
XScale: ‘linear’
YScale: ‘linear’
GridLineStyle: ‘-’
Position: [0.1000 0.1000 0.5000 0.5000]
Units: ‘normalized’
显示 所有属性
用get(句柄,’属性名‘)就能得到想要的属性值
例:取坐标图的标准化坐标
get(gca,'Position')
ans =
0.1300 0.1100 0.7750 0.8150
这里返回的结果分别是[与figure左边界距离,与figure低边界距离,坐标图宽度,坐标图高度],这个可以用set()测试一下。
例:设坐标图左边距为0.1,底边距为0.1,宽度为0.5,高度为0.5
set(gca,'Position',[0.1,0.1,0.5,0.5])
所以现已知坐标图的Position属性,即[左边距,底边距,宽度,高度],以及坐标图的XLim、YLim属性,即[xmin,xmax]、[ymin,ymax]
假设坐标轴原点在内部,则
原 点 标 准 化 坐 标 x = 0 − x min x max − x min × 宽 度 + 左 边 距 {原点标准化坐标}_{x}=\frac{0-{x}_{\min} }{{x}_{\max} -{x}_{\min} }\times宽度 +左边距 原点标准化坐标x=xmax−xmin0−xmin×宽度+左边距
原 点 标 准 化 坐 标 y = 0 − y min y max − y min × 高 度 + 底 边 距 {原点标准化坐标}_{y}=\frac{0-{y}_{\min} }{{y}_{\max} -{y}_{\min} }\times高度 +底边距 原点标准化坐标y=ymax−ymin0−ymin×高度+底边距
3.绘制带箭头的x轴和y轴
Position=get(gca,'Position')
XLim=get(gca,'XLim');
YLim=get(gca,'YLim');
dy=(0-YLim(1))/(YLim(2)-YLim(1));
annotation('Arrow',[Position(1) Position(1)+Position(3)],[Position(2)+dy*Position(4) Position(2)+dy*Position(4)])
dx=(0-XLim(1))/(XLim(2)-XLim(1));
annotation('Arrow',[Position(1)+dx*Position(3) Position(1)+dx*Position(3)],[Position(2) Position(2)+Position(4)])
axis off
axis off%隐藏坐标系
axis on%显示坐标系
结语
最后再贴上效果图代码,我是用function实现的。
function myplot(Axis,fun,latex_x,latex_y,latex_fun)
%Axis=[-5,5,-1,5]%[xmin,xmax,ymin,ymax]
figure()
Position=[0.1,0.05,0.8,0.82];%[距figure左,距figure底,宽度,高度]
set(gca,'Position',Position)
a=get(gcf,'Position');
set(gcf,'Position',[a(1)+a(3)-800,a(2)+a(4)-600,800,600])
fun_l=ezplot(fun);%fun='1+x^2'
set(fun_l,'LineWidth',3)
axis(Axis)
dy=(0-Axis(3))/(Axis(4)-Axis(3));%(0-min(y))/(max(y)-min(y))
annotation('Arrow',[Position(1) Position(1)+Position(3)],[Position(2)+dy*Position(4) Position(2)+dy*Position(4)])
xlabel0=annotation('TextBox',[Position(1)+Position(3),Position(2)+dy*Position(4),0.03,0.03]);
set(xlabel0,'String',latex_x,'Interpreter','latex','FontName','Times New Roman','FontSize',16,'EdgeColor','none')
dx=(0-Axis(1))/(Axis(2)-Axis(1));%(0-min(x))/(max(x)-min(x))
annotation('Arrow',[Position(1)+dx*Position(3) Position(1)+dx*Position(3)],[Position(2) Position(2)+Position(4)])
ylabel0=annotation('TextBox',[Position(1)+dx*Position(3),Position(2)+Position(4),0.03,0.03]);
set(ylabel0,'String',latex_y,'Interpreter','latex','FontName','Times New Roman','FontSize',16,'EdgeColor','none')
t=title(latex_fun,'Interpreter','latex','Position',[0,Axis(4)+(Axis(4)-Axis(3))*0.0396,0]);%title的父对象为坐标
set(t,'FontName','Times New Roman','FontSize',16)
axis off;
end
myplot([-5,5,-1,5],'1+x^2','${k}_{x}$','$E$','$E(k)={{C}_{x}}+\frac{{{\hbar }^{2}}{{k}_{x}}^{2}}{2{{m}_{1}}}$')