关于plot:matlab-在原点设置刻度标签

matlab - set tick label at origin

在用Matlab生成图时,当x和y的最小值都为零时,我宁愿只用一个零来标记原点,而不是在两个轴上都标出。

Matlab默认为后者,就像这样

figure with double origin

而我想要更多这样的东西

figure with single origin

这可以手动完成,但是我正在尝试使过程自动化。 删除0xy刻度标签显然很容易。 但是,我似乎无法访问轴刻度标签位置的任何句柄来正确定位"新原点"的文本框。 在给定的图形中,似乎刻度线与x和y轴的偏移量可能是恒定的(以物理单位,而不是标准化单位),但是我不知道这是否在所有图形或轴上都是标准的。

有任何想法吗?

我正在运行Matlab 2014b。


这是一种简单的方法:

1
2
3
4
5
6
7
8
9
10
11
% somthing to plot:
x = 0:0.1:2*pi;
y = abs(sin(x)+cos(x));
plot(x,y)

% get the handle for the current axes:
ax = gca;
% get the position of the zero tick on y-axis:
zeroYtick = ax.YAxis.TickValues==0;
% remove it (tick and lable)
ax.YAxis.TickValues(zeroYtick) = [];

结果:

zero tick

如果您希望0向左偏移一点,使其位于绘图的角落,则可以使用批注:

1
2
3
4
5
6
7
8
% get the position of the zero tick on x-axis:
zeroXtick = ax.XAxis.TickValues==0;
% remove it (tick and lable)
ax.XAxis.TickValues(zeroXtick) = [];
% place a new zero at the origin:
dim = [0.1 0.01 0.1 0.1];
annotation('textbox',dim,'String','0',...
    'FitBoxToText','on','LineStyle','none')

您将获得:

zero tick 2

annotation的优点是原点始终相对于轴的角放置,并且您无需知道轴刻度的值即可正确偏移它。

编辑:

对于2016a之前的版本,您可以使用以下代码(我写得更紧凑一些):

1
2
3
4
5
6
7
8
9
ax = gca;
% remove the zero tick on y-axis (tick and lable):
ax.YTick(ax.YTick==0) = [];
% remove the zero tick on x-axis (tick and lable):
ax.XTick(ax.XTick==0) = [];
% place a new zero at the origin:
dim = [0.1 0.01 0.1 0.1];
annotation('textbox',dim,'String','0',...
    'FitBoxToText','on','LineStyle','none')

编辑2:

保持0到位的另一种方法是将其粘贴到轴上。这可以通过用轴手柄替换Parent来完成。首先,我们需要注释的句柄(从上次编辑开始):

1
2
t = annotation('textbox',dim,'String','0',...
    'FitBoxToText','on','LineStyle','none');

然后切换Parent并设置新位置:

1
2
t.Parent = ax;
t.Position(1:2) = -[0.2 0.1];

最后,我们通过将Units转换为像素来超级粘合:

1
t.Units = 'Pixels';


下面将不计入yaxis的第一个刻度。您可以通过在删除第一个轴限制之前设置轴限制ylim([0,upper_limit])或手动设置yTicks set(h,'yTick',my_ticks)来确保删除了正确的项。请注意,yTick会更改刻度线的位置,而yTickLabel会更改出现在yTick各个位置的文本

1
2
3
h = plot([0,1],[0,1]);
yTicks = get(h,'yTick');
set(h,'yTick',yTick(2:end));