与 "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,这听起来不太乐观,但等待似乎对您有所帮助这一事实令人鼓舞。
我阅读了 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,这听起来不太乐观,但等待似乎对您有所帮助这一事实令人鼓舞。