与 "undocumented Matlab" 个图形句柄的行为不一致

inconsistent behavior with "undocumented Matlab" figure handles

我阅读了 blog post 关于为绘图标记指定透明度的内容。我在一个简单的例子上尝试了代码,一切都很好。然后我尝试了一个紧密的循环,一次绘制一个点(这样做是为了为图中的每个点分配不同的颜色),并且总是在几个循环周期内,当我抓住 "plothandle.MarkerHandle" 时,它是空的.在这些情况下,这个空对象的 class 是 Matlab.graphics.GraphicsPlaceholder 而当操作成功时,class 是: 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 编辑器中的 selectall/F9)执行第二部分,一切正常。是的,我知道 "undocumented features" 是有风险的,但由于 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]'); 

如果您在 plot 和检索 tmph.MarkerHandle 之间稍等片刻,脚本似乎可以正常工作,这一事实表明您遇到了 on the blog 报告的相同问题用户 运行 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]'); 

解决方法无效 for a user running R2015a,这听起来不太乐观,但等待似乎对您有所帮助这一事实令人鼓舞。