为什么我的人物看起来好像很生气(不应该这样)?

时间:2019-01-09 08:35:17

标签: matlab animation graphics figure undocumented-behavior

考虑以下绘制图形的代码:

figure('Renderer', 'opengl');
N = 50;
tL = linspace(0.5, 6, N).';
tB = sort(randi(100,N,20),1);
yyaxis right; plot(tL, tB);
xlim([2 6]);

例如,当我运行这段代码时,我得到了一个鬼的图,它的移动线应该是静态的(这使用的是我的真实数据,看起来比示例要好一些):

enter image description here

其他一些观察结果:

  • 我注意到没有xlim行,就什么也没有发生(即,该数字是预期的静态)。
  • 我无法在运行相同MATLAB版本的另一台计算机上运行它。
  • “动画”线似乎与轴工具栏的出现和消失(右上角带有缩放等)一致。
  • 当我使用figure('Renderer', 'painters')创建图形时,不会发生这种情况。

有人可以解释为什么会这样吗?这是有记录的行为吗?知道如何控制它吗?

我正在Windows 10 v1803上使用R2018b。我的屏幕已连接到板载GPU,后者是Intel HD Graphics 530(驱动程序版本22.20.16.4749)。

1 个答案:

答案 0 :(得分:1)

  • 首先,您应该了解数字不是静态图片 完全没有它会刷新。如果调整大小/移动 容器(图),该图形将在 互动。
  • 第二,所有对象,包括线条,注释,图例... 同时重绘。不连续的线型将是 容易捕获。这就是为什么您会看到“动画”虚线的原因。
  • 最后,对于matlab,在 Linux / Mac和Windows。在Windows上,图上的“移动鼠标”不会触发 数据跟踪事件。但是在Linux上,数据跟踪器将被激活 在鼠标移动时。数据跟踪,对象选择等事件 刷新情节。

总而言之,您看到的“动画”是作者设计的,应该是。

以下代码禁用了当前轴的命中测试可见性,因此在鼠标移动或单击轴时不会触发重绘事件。但是使用resize事件时,必须重新绘制所有对象(这是故意设计的行为)。

figure('Renderer', 'opengl');
N = 50;
tL = linspace(0.5, 6, N).';
tB = sort(randi(100,N,20),1);
yyaxis right; h = plot(tL, tB,'ButtonDownFcn',@lineCallback); 
set(gca,'HitTest','off')
xlim([2 6]);

function lineCallback(Figure1,Structure1)
    disp('Button Down: redraw...'); 
end

此代码段已在Mac,window10和Ubuntu 18.04上使用MATLAB R2018B进行了测试。一切正常。