Matlab 色条会减慢绘图速度

Matlab 色条会减慢绘图速度,matlab,plot,colorbar,Matlab,Plot,Colorbar,我在同一个轴上绘制许多图像,以制作视频。不幸的是,色条的存在使得循环的速度慢了很多。即使我已经使用caxis“manual”冻结了颜色栏,也会发生这种情况 为什么??我想还是有听众放慢了整个过程,但这真的很糟糕。冻结了色条后,不需要进行任何计算 下面是一个演示,演示了colorbar的一些工作原理,主要目的是冻结它。下面的代码中没有循环 close all figure(1); C = gallery('randcorr',10); ih = imagesc(1*C); ch = colorba

我在同一个轴上绘制许多图像,以制作视频。不幸的是,色条的存在使得循环的速度慢了很多。即使我已经使用caxis“manual”冻结了颜色栏,也会发生这种情况

为什么??我想还是有听众放慢了整个过程,但这真的很糟糕。冻结了色条后,不需要进行任何计算

下面是一个演示,演示了colorbar的一些工作原理,主要目的是冻结它。下面的代码中没有循环

close all
figure(1);
C = gallery('randcorr',10);
ih = imagesc(1*C);
ch = colorbar;
% The colorbar disappears...
ih = imagesc(2*C);
% Must hold plot in order for it not to disappear
hold on
ch = colorbar;
% Now, even though it doesn't disappear, it still changes!
ih = imagesc(3*C);
% Even if we use a lower lever function
set(ih,'CData',4*C);
% We must do this to freeze the colorbar
caxis('manual')
set(ih,'CData',5*C);
ih = imagesc(6*C);
% That worked!

这比我想象的更有趣。我没有答案,但一系列的例子证明了一些非答案。也许比我聪明的人会有更好的运气

例如,使用颜色栏:

figure;
C = gallery('randcorr',10);
ih = imagesc(1*C);
ch = colorbar;
caxis([-2 2])
tic; 
for ix = 1:100
    set(ih,'CData',gallery('randcorr',10));
    drawnow
end
toc;  %2.7 seconds
而且没有色条

figure;
C = gallery('randcorr',10);
ih = imagesc(1*C);

caxis([-2 2])    
tic; 
for ix = 1:100
    set(ih,'CData',gallery('randcorr',10));
    drawnow
end
toc;  %0.67 seconds
是什么导致从2.7秒变为0.67秒

颜色条实际上只是一种特殊的轴,所以可能问题在于图形中有多个有趣的轴

figure;
subplot(2,1,1)
C = gallery('randcorr',10);
ih = imagesc(1*C);
subplot(2,1,2)
C = gallery('randcorr',10);
ih2 = imagesc(1*C);

caxis([-2 2])    
tic; 
for ix = 1:100
    set(ih,'CData',gallery('randcorr',10));
    drawnow
end
toc;  %0.87 seconds (consistently slower,  but not enough)
可能是属性链接导致了速度减慢

figure;
subplot(2,1,1)
C = gallery('randcorr',10);
ih = imagesc(1*C);
subplot(2,1,2)
C = gallery('randcorr',10);
ih2 = imagesc(1*C);
link = linkprop(get(gcf,'children'), 'CLim');

caxis([-2 2])    
tic; 
for ix = 1:100
    set(ih,'CData',gallery('randcorr',10));
    drawnow
end
toc;  %0.88 seconds (pretty much the same as above)
查看默认颜色栏,它有很多颜色细节,可能问题只是需要渲染的颜色数量

figure;
subplot(2,1,1)
C = gallery('randcorr',10);
ih = imagesc(1*C);
subplot(2,1,2)
ih2 = imagesc(repmat(linspace(-2,2,200), 10,1));

caxis([-2 2])    
tic; 
for ix = 1:100
    set(ih,'CData',gallery('randcorr',10));
    drawnow
end
toc;  %0.96 seconds (slower, but still not the 2.7 second colorbar case)

这比我想象的更有趣。我没有答案,但一系列的例子证明了一些非答案。也许比我聪明的人会有更好的运气

例如,使用颜色栏:

figure;
C = gallery('randcorr',10);
ih = imagesc(1*C);
ch = colorbar;
caxis([-2 2])
tic; 
for ix = 1:100
    set(ih,'CData',gallery('randcorr',10));
    drawnow
end
toc;  %2.7 seconds
而且没有色条

figure;
C = gallery('randcorr',10);
ih = imagesc(1*C);

caxis([-2 2])    
tic; 
for ix = 1:100
    set(ih,'CData',gallery('randcorr',10));
    drawnow
end
toc;  %0.67 seconds
是什么导致从2.7秒变为0.67秒

颜色条实际上只是一种特殊的轴,所以可能问题在于图形中有多个有趣的轴

figure;
subplot(2,1,1)
C = gallery('randcorr',10);
ih = imagesc(1*C);
subplot(2,1,2)
C = gallery('randcorr',10);
ih2 = imagesc(1*C);

caxis([-2 2])    
tic; 
for ix = 1:100
    set(ih,'CData',gallery('randcorr',10));
    drawnow
end
toc;  %0.87 seconds (consistently slower,  but not enough)
可能是属性链接导致了速度减慢

figure;
subplot(2,1,1)
C = gallery('randcorr',10);
ih = imagesc(1*C);
subplot(2,1,2)
C = gallery('randcorr',10);
ih2 = imagesc(1*C);
link = linkprop(get(gcf,'children'), 'CLim');

caxis([-2 2])    
tic; 
for ix = 1:100
    set(ih,'CData',gallery('randcorr',10));
    drawnow
end
toc;  %0.88 seconds (pretty much the same as above)
查看默认颜色栏,它有很多颜色细节,可能问题只是需要渲染的颜色数量

figure;
subplot(2,1,1)
C = gallery('randcorr',10);
ih = imagesc(1*C);
subplot(2,1,2)
ih2 = imagesc(repmat(linspace(-2,2,200), 10,1));

caxis([-2 2])    
tic; 
for ix = 1:100
    set(ih,'CData',gallery('randcorr',10));
    drawnow
end
toc;  %0.96 seconds (slower, but still not the 2.7 second colorbar case)

由于对该问题的进一步调查,该问题似乎太深而无法妥善解决


由于没有找到一个好的标准解决方案,我求助于在单独的子批次中制作自己的色条。然后,在循环过程中,这些对象保持不变。为了制作自己的色条,我建议使用子图1,5,1:4作为主图,使用子图1,5,5作为色条。然后,您只需再次使用imagesc绘制caxis的邻域,以制作颜色条。提供y记号,删除x记号。

感谢进一步调查,该问题似乎太深,无法正确解决


由于没有找到一个好的标准解决方案,我求助于在单独的子批次中制作自己的色条。然后,在循环过程中,这些对象保持不变。为了制作自己的色条,我建议使用子图1,5,1:4作为主图,使用子图1,5,5作为色条。然后,您只需再次使用imagesc绘制caxis的邻域,以制作颜色条。提供y个记号,删除x个记号。

我没有看到循环。你能举一个发生这种情况的循环的例子吗?这样我们就可以确定我们看到的是同一件事,并且可以看到哪些特定的函数可能是导致这种情况的原因。我没有看到循环。你能举一个发生这种情况的循环的例子吗?这样我们就可以确定我们看到的是同一件事,并且可以看到哪些特定的功能可能是你的情况的原因?我根本无法复制你的计时,特别是在Mac OS X 10.9,R2013a速度快得多的情况下。只有一点差别——不到10%。当然,我们在猜测OP在他们自己的循环中做了什么。很有趣。FWIW,我正在运行Windows7,R2012b。我有点怀疑视频卡和设置可能同样相关。。。深入研究这个问题有点痛苦。我得到的结果和这个答案类似。Colorbar的速度至少是其他颜色的2倍。。。OSX10.9,R2013b。我根本无法复制您的计时,尤其是在Mac OS X10.9,R2013a速度更快的情况下。只有一点差别——不到10%。当然,我们在猜测OP在他们自己的循环中做了什么。很有趣。FWIW,我正在运行Windows7,R2012b。我有点怀疑视频卡和设置可能同样相关。。。深入研究这个问题有点痛苦。我得到的结果和这个答案类似。Colorbar的速度至少是其他颜色的2倍。。。OSX10.9R2013B。