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

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

Matlab默认是后者,像这样

而我想要更像这样的东西

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

有什么想法吗?

我正在运行 Matlab 2014b。

【问题讨论】:

    标签: matlab plot matlab-figure


    【解决方案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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      • 2010-12-09
      • 1970-01-01
      相关资源
      最近更新 更多