Индикатор цветовой полосы Matlab, который динамически изменяется

Выполняя следующий код, я получаю черную полосу на цветовой полосе, которая меняется в каждом цикле.

Если я изменю лимиты, с 200 на 2000, и прогоню для y= x.^2 +10*i +1000, 2-й версии, то полоска иногда появляется, а иногда нет. Кто-нибудь знает, почему? и как заставить его работать?

Возможно ли иметь динамическую цветовую полосу? то есть, если мы построим вывод звука, чтобы показать в виде цветной полосы уровень звука в дБ

ОТРЕДАКТИРОВАНО:

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, один дополнительный вопрос:

Я пытаюсь добавить вторую цветную полосу слева, но не могу заставить работать обе:

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?, и можно ли уменьшить ширину обеих цветовых полос?


person user1640255    schedule 26.09.2016    source источник
comment
Это действительно взлом colorbar. Почему бы не создать для этого свой собственный объект image?   -  person Suever    schedule 26.09.2016
comment
Смысл в том, чтобы иметь динамическую цветовую полосу рядом с фигурой с 10 графиками, которые меняются в каждом цикле... так как изображение поможет?   -  person user1640255    schedule 26.09.2016
comment
Изображение будет рядом с графиком, где живет цветная полоса. При этом вы можете хотя бы показать нам, что вы ожидаете? Не ясно.   -  person Suever    schedule 26.09.2016
comment
Я редактирую код, и если вы запустите, это то, что я хочу. Если запускать вторую версию, с лимитом 2000 и плюс 1000 в y то полоска иногда появляется, а других нет. Тем не менее, я не считаю, что это правильный путь. я ожидал получить что-то вроде звука дБ, который вы можете найти в некоторых музыкальных инструментах...   -  person user1640255    schedule 26.09.2016
comment
Чтобы добавить еще одну цветовую полосу, нужно добавить еще одну ось:   -  person EBH    schedule 27.09.2016
comment
Я создаю (NEW EDIT) вторую цветовую полосу, но не могу заставить ее работать правильно. Я также не могу использовать вашу версию изображения....   -  person user1640255    schedule 28.09.2016
comment
Проблема в том, что вы используете colormap, чтобы сделать черную полосу, и есть только одна colormap на фигуру, поэтому каждый раз, когда вы рисуете полосу на обеих цветных полосах. Почему нельзя использовать метод image? это гораздо более гибко.   -  person EBH    schedule 28.09.2016


Ответы (3)


В своем последнем комментарии вы хотели иметь 2 разных colormaps на одной фигуре. Это не так просто, поскольку 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

И результат:

dyn_cb2_alt

person EBH    schedule 28.09.2016

Причина, по которой вы иногда не видите черный цвет на цветовой полосе, заключается в том, что он очень тонкий, и все, что вам нужно сделать, это добавить к нему некоторую ширину, как это 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

и результат:

dyn_colorbar

person EBH    schedule 26.09.2016
comment
Я воспользуюсь, возможно, этим методом, так как второй немного сбивает с толку дополнительными цифрами в основании цветовой шкалы изображения. Можно ли использовать вторую цветовую полосу, подобную этой, справа, слева или внизу, в которой у меня будет еще один индикатор для игры между некоторыми пределами? другой y или y (конец-5) - person user1640255; 27.09.2016
comment
можно сделать это, вам нужно изменить ширину, верно? - person user1640255; 27.09.2016
comment
@user1640255 user1640255 посмотрите здесь способ построения двух цветных полос с обеих сторон - person EBH; 27.09.2016
comment
Спасибо!!! ... действительно профессиональный ответ и подробный .... Я использую первый метод, я попробую другой (изображение). Еще раз спасибо! - person user1640255; 28.09.2016
comment
пожалуйста, дайте мне знать, если в 1-м методе, который я могу использовать, я могу изменить пределы - границы второй цветной полосы, если у меня может быть вторая полоса - person user1640255; 28.09.2016

Вот идея того, как реализовать предложение @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

Этот код создает 2 оси внутри фигуры, одна для plot, а другая для «цветной полосы», которая на самом деле является изображением.

dyn_colorbar

Несколько цветовых полос

Если вы хотите добавить еще одну цветовую полосу, это можно легко сделать, вот пример для 3:

x = 1:10;
cb_width = 0.08; % 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,1) c(1:2000) nan(2000,1) 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
f = gcf;
back = f.Color;
cmap = [back; 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;
    t = x.^2 +30*k +700;
    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),3) = 2.1; % <-- middle bar
    h.CData(w+t(end),5) = 2.1; % <-- right bar
    drawnow;
    disp(y(end))
    pause(1)
end

который дает:

dyn_colorbar3

Левая и правая цветовые полосы:

Добавить еще одну цветную полосу слева немного сложнее:

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

слева_и_справа

person EBH    schedule 26.09.2016
comment
это здорово! ... только один вопрос, если у меня есть еще одна переменная y на рисунке, и я хотел бы иметь вторую цветовую полосу, возможно ли это? какой метод лучше, 1-й или 2-й (изображение)? - person user1640255; 27.09.2016
comment
@user1640255 user1640255, на мой взгляд, с этим методом проще, см. мое редактирование. - person EBH; 27.09.2016