matlab - matlab 的奇怪 xtick/ytick 标签行为
问题描述
我偶然发现了 matlab 的 xticklabels 和 yticklabels 行为的不直观行为。我将 xticklabels 的输出存储到一个变量中,对其进行修改,然后再次应用它并注意标签现在已移动。这是预期的行为,如果是,为什么(可选:为什么将其作为预期行为有意义)?
想法:每一步都显示 xticks,但每第二步只显示标签。
%setup a figure to display
figure;
data=randn(1,21);
plot(-10:10,data);
xlim([-5 10]) %cut out a piece of interest from the data
xticks(-10:2:10); %adjust tick spacing to favorite
%now: keep xticks but remove every 2nd label
lbls=xticklabels;
lbls(1:2:end)={' '}; %set every 2nd label to empty space
pause(1); %take a deep breath...
xticklabels(lbls)
解决方案
问题是,虽然xtick
函数返回所有现有刻度(可见和隐藏刻度)的值,但该 xticklabels
函数只返回可见刻度的标签。我猜这种行为是由于 MATLAB 没有为不可见的刻度分配任何标签。因此,您的 xtick 向量是:
[-10 -8 -6 -4 -2 0 2 4 6 8 10]
虽然您的 xticklabels 单元格数组是:
{'-4'}, {'-2'}, {'0'}, {'2'}, {'4'}, {'6'}, {'8'}, {'10'}
并且,替换后:
{' '}, {'-2'}, {' '}, {'2'}, {' '}, {'6'}, {' '}, {'10'}
由于图片中唯一可见的刻度是分配给范围从 -4 到 10 的刻度,因此相应显示的标签是元胞数组中从第四个到最后一个的元素。未分配标签的刻度(因为标签比刻度少)以空单元格为特征:
{'2'}, {' '}, {'6'}, {' '}, {'10'}, {empty}, {empty}, {empty}
解决方案: 您有多个解决方案。第一个是删除不落在 x 轴范围内的刻度:
%setup a figure to display
figure;
data=randn(1,21);
plot(-10:10,data);
xlim([-5 10]) %cut out a piece of interest from the data
xticks(-10:2:10); %adjust tick spacing to favorite
% Delete external ticks
xt = xticks();
xl = xlim(); xt(xt<xl(1)) = []; xt(xt>xl(2)) = []; xticks(xt);
%now: keep xticks but remove every 2nd label
lbls=xticklabels;
lbls(1:2:end)={' '}; %set every 2nd label to empty space
pause(1); %take a deep breath...
xticklabels(lbls)
另一种解决方案是手动分配标签,将 xticks 返回的数字转换为字符串值:
%setup a figure to display
figure;
data=randn(1,21);
plot(-10:10,data);
xlim([-5 10]) %cut out a piece of interest from the data
xticks(-10:2:10); %adjust tick spacing to favorite
%now: keep xticks but remove every 2nd label
lbls= arrayfun(@(x) num2str(x), xticks(), 'UniformOutput', false);
lbls(1:2:end)={' '}; %set every 2nd label to empty space
pause(1); %take a deep breath...
xticklabels(lbls)
您会注意到两种解决方案之间的刻度不同。这是由于两个向量之间的偶数/奇数元素不同,因此不同的元素被替换为空白。
推荐阅读
- java - 有没有办法在内存中公开 ActiveMQ 端口
- flutter - Dart 中的“线程”使用 Flutter for web
- javascript - 如何使用 JAVA 从 SessionStorage 获取值
- assembly - 如何用汇编添加两个巨大的数字
- azure - MS 图形日历 API | 订阅用户日历 | 并行创建 100 个或更多会议时缺少 50% 的会议通知
- c# - 在插入数据库之前转换编码
- ios - 自动使用 TouchID 进行身份验证,不显示任何提示
- python - 在 Python 中使用正交多项式平滑大型噪声数据集
- c# - Azure 存储“租约” - 正确的异常方法
- java - java.lang.UnsatisfiedLinkError:java.library.path 中没有 netty-transport-native-epoll