непоследовательное поведение с недокументированными дескрипторами фигур Matlab

Я прочитал сообщение в блоге о назначении прозрачности для сюжетные маркеры. Я попробовал код на простом примере, и все было хорошо. Затем я попробовал замкнутый цикл, рисуя по одной точке за раз (делая это, чтобы назначить разный цвет каждой точке на графике), и неизменно в течение нескольких циклов циклов, когда я хватаю «plothandle.MarkerHandle», он пуст. . В этих случаях класс этого пустого объекта — Matlab.graphics.GraphicsPlaceholder, а при успешном выполнении операции — класс: matlab.graphics.primitive.world.Marker

Далее следует основной цикл. colormatrix назначает цвет [r,g,b] каждой точке данных.

hold on
opacity = 0.5; 
for jk = 1:numel(idx
  tmph = plot(foox(jk),fooy(jk),'o','color',colormatrix(jk,:) );
     tmpk = tmph.MarkerHandle;

     tmpk.FaceColorData = uint8(double(tmpk.EdgeColorData).* [1,1,1,opacity]');
     tmpk.EdgeColorData = uint8(double(tmpk.EdgeColorData).* [1,1,1,opacity]');

end

Я пробовал такие вещи, как очистка переменных в каждом цикле, установка таймера задержки и т. д., но безуспешно. Я использую Matlab R2015a.

РЕДАКТИРОВАТЬ: вот простой пример. Что я похоже обнаружил, так это то, что если я запускаю весь сценарий, он всегда терпит неудачу. Если я разобью его на две части, где отмечено, и выполню второй раздел отдельным нажатием клавиши (ctrl-enter или selectall/F9 в редакторе IDE), все работает. И да, я знаю, что «недокументированные функции» рискованны, но поскольку MathWorks до сих пор не понял, что разрешение прозрачности и присвоение индексированных цветов — это хорошо для функции plot, я все еще ищу лучший обходной путь, чем использование patch для рисования каждой точки данных.

figure
xfoo = 1:10;
yfoo = 2*xfoo;
tmph = plot(xfoo,yfoo,'p','color',[1,0,1]);
hold on
opacity = 0.7; 
%  wait a while here. 
tmpk = tmph.MarkerHandle;
tmpk.FaceColorData = uint8(double(tmpk.EdgeColorData).*[1,1,1,opacity]');
tmpk.EdgeColorData =  uint8(double(tmpk.EdgeColorData).*[1,1,1,opacity]'); 

person Carl Witthoft    schedule 28.01.2016    source источник
comment
Пожалуйста, приведите воспроизводимый пример.   -  person excaza    schedule 28.01.2016
comment
Сообщение в блоге от ноября 2014 года. Вы уверены, что недокументированные функции все еще применимы к 2015a? В том-то и дело с недокументированными функциями: они могут исчезнуть в любой день. См. этот комментарий, решение которого не работает для этого пользователя   -  person Andras Deak    schedule 28.01.2016
comment
@AndrasDeak иногда это работает - вот что меня раздражает. Внутренности Matlab работают непоследовательно.   -  person Carl Witthoft    schedule 28.01.2016


Ответы (1)


Тот факт, что сценарий работает, если вы немного подождете между plot и получением tmph.MarkerHandle, предполагает, что у вас та же проблема, о которой сообщалось в блоге пользователя, использующего R2014b. Яир предложил позвонить drawnow после сюжета:

figure
xfoo = 1:10;
yfoo = 2*xfoo;
tmph = plot(xfoo,yfoo,'p','color',[1,0,1]);
hold on
opacity = 0.7; 
drawnow;
tmpk = tmph.MarkerHandle;
tmpk.FaceColorData = uint8(double(tmpk.EdgeColorData).*[1,1,1,opacity]');
tmpk.EdgeColorData =  uint8(double(tmpk.EdgeColorData).*[1,1,1,opacity]'); 

Обходной путь не сработал для пользователя, использующего R2015a, что звучит не многообещающе, но тот факт, что ожидание помогает вам, обнадеживает.

person Andras Deak    schedule 28.01.2016
comment
Я добавил drawnow, и в быстром тесте это работает. Больше новостей позже. - person Carl Witthoft; 28.01.2016
comment
@CarlWitthoft скрестил пальцы. - person Andras Deak; 28.01.2016
comment
Да, работал цикл более 700 точек. Неоднократно. Так что, по крайней мере, для моей установки MATLAB я в порядке. .--- до следующего обновления... - person Carl Witthoft; 28.01.2016
comment
@CarlWitthoft Рад это слышать, спасибо за отзыв! - person Andras Deak; 28.01.2016