20

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

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]);

例如,当我运行此代码时,我会得到一个带有移动线的闹鬼图形,该图形应该是静态的(这个使用的是我的真实数据,看起来比示例好一点):

在此处输入图像描述

几个额外的观察:

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

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

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

2019 年 9 月更新:我在 Windows 10 v1903 上的 R2019b 上也会发生这种情况。正如评论中所建议的,以下是输出opengl info

                          Version: '4.5.0 - Build 25.20.100.6373'
                           Vendor: 'Intel'
                         Renderer: 'Intel(R) HD Graphics 530'
            RendererDriverVersion: '25.20.100.6373'
        RendererDriverReleaseDate: '18-Nov-2018'
                   MaxTextureSize: 16384
                           Visual: 'Visual 0x07, (RGBA 32 bits (8 8 8 8), Z depth 16 bits, Hardware acceleration, Double buffer, Antialias 8 samples)'
                         Software: 'false'
             HardwareSupportLevel: 'full'
        SupportsGraphicsSmoothing: 1
    SupportsDepthPeelTransparency: 1
       SupportsAlignVertexCenters: 1
                       Extensions: {223×1 cell}
               MaxFrameBufferSize: 16384
4

1 回答 1

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 进行了测试。一切正常。

于 2020-07-31T07:07:54.913 回答