paleta colores matlab dynamic matlab-figure colorbar colormap

colores - map colors matlab



Indicador de barra de color Matlab que cambio dinĂ¡mico (3)

Al ejecutar el siguiente código, aparece una barra negra en la barra de colores que cambia en cada ciclo.

Si cambio los límites, de 200 a 2000, y corro para y= x.^2 +10*i +1000 , segunda versión, a veces aparece la barra, otros no. ¿Alguien sabe por qué? y ¿cómo puede hacer que funcione?

¿Es posible tener una barra de colores dinámica? es decir, si graficamos una salida de sonido, mostraremos como colorbar el nivel de sonido en dB

EDITADO:

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

gracias.

NUEVA EDICIÓN:

basado en la excelente respuesta de EBH, una pregunta suplementaria:

Estoy tratando de agregar un segundo colobar, a la izquierda, pero no puedo hacer que ambos funcionen:

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

Entonces, ¿puedo hacer que funcione? ¿El problema es la caxis ?, y ¿es posible disminuir el ancho de ambas barras de colores?


La razón por la que a veces no ves negro en la barra de colores es que es muy delgada, todo lo que tienes que hacer es agregarle algo de ancho, como este a continuación:

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

y el resultado:


Aquí hay una idea de cómo implementar la sugerencia de @Suever en los comentarios:

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

Este código crea 2 ejes dentro de una figura, uno es para la plot y otro para la "barra de color" que en realidad es una imagen.

Múltiples barras de color

Si desea agregar otra barra de colores, se puede hacer fácilmente, aquí hay un ejemplo para 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

lo que da:

Barras de color izquierda y derecha:

Agregar otra barra de color a la izquierda es un poco más complicado:

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


En su último comentario, quería tener 2 colormaps de colormaps diferentes en una figura. Esto no es tan simple, ya que MATLAB solo admite un mapa de colores por figura, y es un tema para otra pregunta. Sin embargo, como ya lo preguntaste aquí, publicaré otra respuesta.

Entonces dice así:

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

Y el resultado es: