动态变化的Matlab色条指示器

动态变化的Matlab色条指示器,matlab,dynamic,matlab-figure,colorbar,colormap,Matlab,Dynamic,Matlab Figure,Colorbar,Colormap,运行下一个代码时,颜色栏中会出现一个黑色条,在每个循环中都会发生变化 如果我将限制从200更改为2000,并运行第二版的y=x.^2+10*I+1000,则该条有时会出现,其他则不会。有人知道为什么吗?如何让它工作 有可能有一个动态的色条吗?i、 e.如果我们绘制一个声音输出,以颜色条的形式显示声级,单位为dB 编辑: x = 1:10; figure; for i = 1:10 y= x.^2 +10*i; % y= x.^2 +10*i +1000; % 2nd version plot(x

运行下一个代码时,颜色栏中会出现一个黑色条,在每个循环中都会发生变化

如果我将限制从200更改为2000,并运行第二版的
y=x.^2+10*I+1000
,则该条有时会出现,其他则不会。有人知道为什么吗?如何让它工作

有可能有一个动态的色条吗?i、 e.如果我们绘制一个声音输出,以颜色条的形式显示声级,单位为dB

编辑:

x = 1:10;
figure;
for i = 1:10
y= x.^2 +10*i;
% y= x.^2 +10*i +1000; % 2nd version
plot(x,y,'-r'); hold on;
pause(1)
caxis([0 200]); 
% caxis([0 2000]); % 2nd version
cmap = jet(200);
% cmap = jet(2000);% 2nd version
cmap(y(end), :) = 0;
set(gcf, 'Colormap', cmap);
colorbar;
disp(y(end))
grid on;
end
多谢各位

新编辑:

根据EBH的优秀答案,提出一个补充问题:

我正试图在左侧添加第二个colobar,但我无法同时使用它们:

x = 1:10;
w1 = -15:15;
w2 = -1:1;
figure;
for i = 1:10

% %{
y= x.^2 +10*i +1000; %  
plot(x,y,'-r'); hold on;
pause(1)
caxis([0 2000]); %  
cmap1 = jet(2000);% 
cmap1(w1+y(end), :) = 0;
set(gcf, 'Colormap', cmap1);
h1=colorbar('eastoutside');
ylabel(h1, 'y')
disp(y(end))
%}


% %{
y2= x.^2 +5*i; %  
plot(x,y2,'-b'); hold on;
pause(1)
caxis([0 150]); 
cmap2 = jet(150);
cmap2(w2+y2(end-5), :) = 0; hold on;
cmap2(w2+y2(end), :) = 0; hold on;
set(gcf, 'Colormap', cmap2);
h2=colorbar('westoutside');
ylabel(h2, 'y2')
disp(y2(end-5))
disp(y2(end))

%}

grid on;
end

那么,我能让它工作吗?该问题是否属于caxis?是否可以减小两个色条的宽度?

以下是如何在评论中实施@Suever建议的想法:

x = 1:10;
cb_width = 0.04;
c = sum(jet(4000),2);
c = c(1:2000);
h = imagesc(c);
h.Parent.Position(1) = 1-cb_width-0.07;
h.Parent.Position(3) = cb_width;
h.Parent.YAxisLocation = 'right';
h.Parent.XAxis.Visible = 'off';
axis xy
box off
colormap jet
ax = axes;
ax.Position(3) =  ax.Position(3) - cb_width;
grid on;
hold on;
w = -5:5; % <-- this is very important!
for k = 1:10
    h.CData = c;
    y = x.^2 +10*k +1000;
    plot(ax,x,y,'-r');
    h.CData(w+y(end),1) = nan;
    drawnow;
    disp(y(end))
    pause(1)
end
其中:

左右色条: 在左侧添加另一个颜色栏有点棘手:

x = 1:10;
cb_width = 0.88; % for all the colorbars together
c = sum(jet(4000),2);
% we define the colorbars area as [c nan c nan c]:
c = [c(1:2000) nan(2000,50) c(1:2000)];
h = imagesc(c);
h.Parent.Position(1) = h.Parent.Position(1)-0.07;
h.Parent.Position(3) = cb_width;
axis xy
box off
h.Parent.XAxis.Visible = 'off';
yyaxis left
h.Parent.YAxis(1).Color = [0 0 0];
yyaxis right
h.Parent.YAxis(2).Color = [0 0 0];
h.Parent.YAxis(2).Limits = h.Parent.YAxis(1).Limits;
% make the nan transparent
cmap = [1 1 1; jet(2000); 0 0 0];
colormap(cmap)
% now we start to draw the data:
ax = axes;
% ax.Position(3) =  ax.Position(3) - cb_width;
grid on;
hold on;
w = -5:5;
for k = 1:10
    h.CData = c;
    y = x.^2 +10*k +1000;
    z = x.^2 +15*k +500;
    plot(ax,x,y,'-r',x,z,'-.b',x,t,'--m');
    h.CData(w+y(end),1) = 2.1; % <-- left bar
    h.CData(w+z(end),52) = 2.1; % <-- right bar
    drawnow;
    disp(y(end))
    pause(0.2)
end
x=1:10;
cb_宽度=0.88;%将所有颜色条放在一起
c=总和(jet(4000),2);
%我们将色条区域定义为[c nan c nan c]:
c=[c(1:2000)nan(2000,50)c(1:2000)];
h=图像sc(c);
h、 父位置(1)=h父位置(1)-0.07;
h、 父位置(3)=cb_宽度;
xy轴
封杀
h、 Parent.XAxis.Visible='off';
YY轴左
h、 Parent.YAxis(1.Color=[0];
YY轴右
h、 Parent.YAxis(2.Color=[0];
h、 Parent.YAxis(2).Limits=h.Parent.YAxis(1).Limits;
%使nan透明
cmap=[1;jet(2000);0];
彩色地图(cmap)
%现在我们开始绘制数据:
ax=轴;
%最大位置(3)=最大位置(3)-断路器宽度;
网格化;
等等
w=-5:5;
对于k=1:10
h、 CData=c;
y=x.^2+10*k+1000;
z=x.^2+15*k+500;
图(ax,x,y,'-r',x,z,'-b',x,t,'-m');

h、 CData(w+y(结束),1)=2.1;% 你有时在色条上看不到黑色的原因是它很薄,你所要做的就是给它增加一些宽度,如下面的
w

x = 1:10;
w = -5:5;
for k = 1:10
    y= x.^2 +10*k +1000;
    plot(x,y,'-r');
    hold on;
    pause(1)
    caxis([0 2000]);
    cmap = jet(2000);
    cmap(w+y(end), :) = 0;
    set(gcf, 'Colormap', cmap);
    colorbar;
    disp(y(end))
    grid on;
end
结果是:


在您最后的评论中,您希望在一个图形上有两个不同的
颜色贴图。这并不是那么简单,因为MATLAB只支持每个图形一个颜色贴图,这是另一个问题的主题。不过,既然你已经在这里问过了,我就发布另一个答案

所以它是这样的:

x = 1:10;
w = -15:15;
cmap = [jet(2000); jet(2000)];

% left colorbar
lcb = subplot(1,3,1);
caxis([1 2000])
h1 = colorbar('west','Position',[0.1 0.11 0.05 0.815]);
h1.Limits = [1 1000];
h1.TickLabels = num2str(linspace(200,2000,numel(h1.Ticks)).');
ylabel(h1,'y')
axis off

% right colorbar
rcb = subplot(1,3,3);
caxis([1 150])
h2 = colorbar('east','Position',[0.85 0.11 0.05 0.815]);
h2.Limits = [76 150];
h2.TickLabels = num2str(linspace(10,150,numel(h2.Ticks)).');
ylabel(h2, 'y2')
axis off

% main axes
ax = axes;
ax.Position = [0.2 0.11 0.62 0.815];
grid on
hold on

scale = floor(2000/150);

for k = 1:10
    y = x.^2 +10*k +1000;
    y2= x.^2 +5*k;

    cmap = [jet(2000); jet(2000)];
    cmap(w+y(end),:) = 0; 
    disp(y(end))

    cmap(scale+2000+w+y2(end-5)*scale, :) = 0;
    cmap(scale+2000+w+y2(end)*scale, :) = 0;
    disp([y2(end-5) y2(end)])

    colormap(cmap)
    plot(ax,x,y,'-r',x,y2,'-b');
    pause(0.1)
end
结果是:


这真是对
色条的一种破解。为什么不创建自己的自定义
图像
对象来执行此操作?关键是在图形旁边有一个动态颜色栏,每个循环上有10个变化的绘图。。。。那么,图像将如何帮助呢?图像将位于色条所在的绘图旁边。话虽如此,你至少能告诉我们你的期望吗?不清楚。我编辑代码,如果你运行它,这就是我想要的。如果运行第二个版本,限制为2000,y方向上加1000,则该条有时会显示,其他人则不会。不过,我不认为这是正确的方式。我希望能在一些音乐工具中找到类似dB声音的东西…添加另一个颜色条的方法是添加另一个轴:这些很棒。。。只有一个问题,如果我在图中有另一个y变量,我想有第二个颜色条,这可能吗?哪种方法最好,第一种还是第二种(图像)?@user1640255我认为,使用这种方法更简单,请参见我的编辑。我可能会使用这种方法,因为第二种方法与图像颜色栏底部的额外数字有点混淆。是否可以使用第二个颜色栏,类似于这个,在右边、左边或底部,在其中我将有另一个指示器在一些限制之间播放?另一个y或y(end-5)可以这样做,您需要更改宽度,对吗?@user1640255想办法在两侧绘制两个颜色条谢谢。。。非常专业的回应和详细的。。。。我使用第一种方法,我将尝试另一种(图像)。再次感谢你!请让我知道,在第一种方法中,如果我可以使用第二个色条,我是否可以更改第二个色条的限制-边界
x = 1:10;
w = -15:15;
cmap = [jet(2000); jet(2000)];

% left colorbar
lcb = subplot(1,3,1);
caxis([1 2000])
h1 = colorbar('west','Position',[0.1 0.11 0.05 0.815]);
h1.Limits = [1 1000];
h1.TickLabels = num2str(linspace(200,2000,numel(h1.Ticks)).');
ylabel(h1,'y')
axis off

% right colorbar
rcb = subplot(1,3,3);
caxis([1 150])
h2 = colorbar('east','Position',[0.85 0.11 0.05 0.815]);
h2.Limits = [76 150];
h2.TickLabels = num2str(linspace(10,150,numel(h2.Ticks)).');
ylabel(h2, 'y2')
axis off

% main axes
ax = axes;
ax.Position = [0.2 0.11 0.62 0.815];
grid on
hold on

scale = floor(2000/150);

for k = 1:10
    y = x.^2 +10*k +1000;
    y2= x.^2 +5*k;

    cmap = [jet(2000); jet(2000)];
    cmap(w+y(end),:) = 0; 
    disp(y(end))

    cmap(scale+2000+w+y2(end-5)*scale, :) = 0;
    cmap(scale+2000+w+y2(end)*scale, :) = 0;
    disp([y2(end-5) y2(end)])

    colormap(cmap)
    plot(ax,x,y,'-r',x,y2,'-b');
    pause(0.1)
end