matlab - 在原点设置刻度标签

Posted

技术标签:

【中文标题】matlab - 在原点设置刻度标签【英文标题】:matlab - set tick label at origin 【发布时间】:2017-02-03 14:54:35 【问题描述】:

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

Matlab默认是后者,像这样

而我想要更像这样的东西

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

有什么想法吗?

我正在运行 Matlab 2014b。

【问题讨论】:

【参考方案1】:

这是一个简单的方法:

% 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) = [];

结果:

如果您希望0 向左偏移一点,那么它将位于绘图的角落,您可以使用注释:

% 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')

你会得到:

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


编辑:

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

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 替换为轴句柄来完成的。首先,我们需要注释的句柄(从上次编辑继续):

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

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

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

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

t.Units = 'Pixels';

【讨论】:

这正是我想要的,即0 从左边一点点偏移。注释似乎可以解决问题,但是如果您随后调整图形大小,0 会移动。另外,我假设您使用的版本晚于 2014b,因为图形句柄不同。我没有处理 ax.XAxis 等。但这并不重要,我可以删除刻度标签,正确注释 0 是我卡住的地方。 @Brian,如果您将图形挤压得过多,则 0 设置不正确,否则,我可以根据需要调整它的大小,并且它会固定在它的位置上。无论如何,我为早期版本的 Matlab 添加了一个版本的代码。 调整大小仍然会在我的系统上移动0。我不确定你是否有不同的设置而不是你的设置,但是一旦我调整图形的大小,带注释的 0 就会四处移动,以免位于原点(请注意,即使图形是仅略微调整大小)。我当然很欣赏这个答案,但它并不能完全满足我的要求。我尝试在调整图形大小后添加注释,结果相同,并尝试使用归一化和物理单位的轴单位调整大小。【参考方案2】:

以下将排除 yaxis 上的第一个刻度,而根本不移动图形。您可以通过在删除第一个之前设置轴限制 ylim([0,upper_limit]) 或手动设置 yTicks set(h,'yTick',my_ticks) 来确保删除正确的项目。注意yTick会改变刻度的位置,而yTickLabel会改变出现在yTick每个位置的文本

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

【讨论】:

以上是关于matlab - 在原点设置刻度标签的主要内容,如果未能解决你的问题,请参考以下文章

excel坐标轴不等间距刻度该怎么设置

如何从ggplot中原点的第一个轴刻度开始

matplotlib如何获取坐标轴刻度值?

matlab中如何设置自定义刻度?

在对数轴刻度中设置指数符号 - Matlab

matlab双y轴作图两个y坐标轴设置问题,y轴刻度设置语句没发挥作用,求解答