Почему моя фигура выглядит анимированной (а не должна)?

Рассмотрим следующий код, который рисует фигуру:

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') этого не происходит

Может кто-нибудь объяснить, почему это происходит? Это документированное поведение? Есть идеи, как это контролировать?

Я работаю с R2018b на Windows 10 v1803. Мои экраны подключены к встроенному графическому процессору Intel HD Graphics 530 (версия драйвера 22.20.16.4749).

0 ответов

  • Во-первых, вы должны понимать, что фигура - это вовсе не статичная картинка. Он часто обновляется. Если изменить размер / переместить контейнер (рисунок), фигура будет перерисована сразу после взаимодействия.
  • Во-вторых, все объекты, включая линии, аннотации, легенды..., перерисовываются одновременно. Типы прерывистых линий будут легко зафиксированы. Вот почему вы могли увидеть "анимированную" пунктирную линию.
  • Наконец, для Matlab есть некоторые различия во взаимодействии в Linux/Mac и Windows. В Windows перемещение мыши на рисунке не запускает событие отслеживания данных. Но в Linux Data Tracker будет активирован при движении мыши. События для отслеживания данных, выбора объекта и т. Д. Обновят график.

В общем, "анимация", которую вы видите, разработана автором, и так и должно быть.

Следующий код отключил видимость проверки попадания для текущих осей, поэтому событие перерисовки не будет запускаться во время перемещения мыши или щелчка по осям. Но с событием изменения размера все объекты должны быть перерисованы (что было специально разработано).

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

Этот фрагмент кода был протестирован с использованием MATLAB R2018B на Mac,window10 и Ubuntu 18.04. Все работает штрафы.

Другие вопросы по тегам