与“未记录的Matlab”图形句柄不一致的行为

3
我读了关于给绘图标记分配透明度的博客文章。我在一个简单的例子上尝试了代码,一切正常。然后我尝试了一个紧密循环,每次只绘制一个点(这样做是为了将不同的颜色分配给图中的每个点),但是在几个循环周期内,当我获取“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或在IDE编辑器中选择所有/ F9)中执行第二个部分,则一切正常。是的,我知道“未记录的功能”很危险,但由于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]'); 

3
请提供一个可复现的例子。 - sco1
这篇博客文章是2014年11月发布的。你确定这些未记录的特性仍适用于2015a吗?这就是未记录特性的问题:它们随时可能消失。请参见此评论,其中的解决方案对于此用户无效。 - Andras Deak -- Слава Україні
@AndrasDeak 它“有时候”起作用 -- 这正是让我感到恼火的地方。Matlab 的内部机制表现不一致。 - Carl Witthoft
1个回答

4
脚本似乎在plot和检索tmph.MarkerHandle之间等待一段时间后运行,这表明您遇到了与R2014b用户在博客中报告的相同问题。 Yair建议在绘图后调用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的用户无效,听起来并不乐观,但你提到等待似乎有帮助,这是令人鼓舞的。

我添加了 drawnow 并在快速测试中似乎能够工作。稍后有更多消息。 - Carl Witthoft
@CarlWitthoft 祈祷好运。 - Andras Deak -- Слава Україні
没错,已经成功地循环了700个点。反复测试过了。所以至少对于我的MATLAB安装来说,一切正常。直到下一次更新... - Carl Witthoft
@CarlWitthoft 很高兴听到这个好消息,感谢您的反馈! - Andras Deak -- Слава Україні

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接