Como gerar um mapa de colors / colorbar não linear?

Eu gostaria de mostrar uma barra de colors não uniforme como na primeira foto. Eu tentei o código abaixo. ‘mycamp4’ é um mapa de colors salvo manualmente. O resultado é mostrado como a segunda figura. O número 0.1 e 1.5 será muito fechado também ver. Como posso fazer a barra de colors na primeira foto?

 v = [0.1 1 1.5 5 7.5 10 30]; v_2 = [0.1 1.5 5 7.5 10 30]; contourf(X,Y,pdf_normal',v); h = colorbar; load('MyColormaps','mycmap4'); set(gcf,'Colormap',mycmap4); set(h, 'YTick', v_2) 

Imagem 1:

insira a descrição da imagem aqui

Figura 2:

insira a descrição da imagem aqui

Aqui uma explicação passo a passo.

Primeiro considere o seguinte exemplo:

 [X,Y,Z1] = peaks; figure(1) [~,h1] = contourf(X,Y,Z1,20); a1 = colorbar; colormap(jet) caxis([-6,6]) 

que lhe dará o seguinte enredo:

insira a descrição da imagem aqui

Tem dados lineares e um mapa de colors linear. Agora eu quero escalar o Z -Data para obtê-lo não linear como no seu caso. Eu escolhi um simples quadrado dos dados.

 Z2 = get(h1,'ZData'); scalefactor = @(x) sign(x).*x.^2; Z2 = scalefactor(Z2); 

Esses são os dados de exemplo reais, semelhantes aos seus:

 figure(2) [~,h2] = contourf(X,Y,Z2,20); a2 = colorbar; colormap(jet) caxis([-6^2,6^2]) 

insira a descrição da imagem aqui

Agora temos dados não lineares, mas ainda um colormap linear e uma colorbar colormap .

Até agora tudo era para gerar dados de exemplo semelhantes aos seus.


Agora a resposta atual:

Receba os dados do seu enredo:

 Z3 = get(h2,'ZData'); 

e escalá-lo com uma relação que você espere saber mais ou menos:

 descalefactor = @(x) sign(x).*abs(x).^(1/2); Z3 = descalefactor(Z3); 

Plotar esses dados escalonados:

 figure(3) [~,h3] = contourf(X,Y,Z3,20); a3 = colorbar; colormap(jet) caxis([-6,6]) 

obter os Y-Ticks e scale it with the inverse function , como seus dados:

 ticks = get(a3,'YTick'); ticks = scalefactor(ticks); 

defina esses tiques de colorbar em escala inversa:

 set(a3,'YTickLabel',ticks) 

e você finalmente consegue um enredo aparentemente linearizado (mas você poderia simplesmente fazer backup de seus dados não-lineares de antes), com um mapa de colors não linear e ticks de colorbar.

insira a descrição da imagem aqui

Como esperado, o gráfico parece o mesmo do primeiro exemplo, mas com um eixo de barra de colors dimensionado.

Se você não tiver nenhum relacionamento funcional, tente obter um, por exemplo, com a checkbox de ferramentas de ajuste de curva.

Você pode personalizar o mapa de colors e as marcações na barra de colors, mas a própria barra de colors é baseada em intervalos lineares e não é possível alterar isso.

Há uma solução alternativa embora.

Vamos dizer que você quer sua barra de colors como na imagem 1 com N intervalos não-lineares (por exemplo, color_limits = [1 2 20], se N = 2). Voce tem que:

1) defina outra variável para seus dados. por exemplo

 data2 = nan(size(data)); for i=1:N b = data>color_limits(i) & data>=color_limits(i+1); data2(b) = i-0.5; end 

Basicamente você está binning dados, usando os intervalos em color_limits, em uma variável diferente data2 que você irá exibir

2) faça sua imagem de data2

3) defina os limites da barra de colors: caxis ([0 N])

4) definir um mapa de colors com N colors, por exemplo, colormap (jet (N))

5) personalize os carrapatos na barra de colors

Quando você tentar doc colorbar , encontrará uma referência ao mapa de colors. E depois de tentar doc colormap eles basicamente dão 3 opções para definir o mapa de colors.

  1. Digite um mapa (por exemplo, um obtido por get ou um projetado anteriormente, isso é o que você tentou)
  2. Selecione um mapa de colors integrado com o Editor de propriedades.
  3. Use o Editor do Colormap, acessível em Edit> Colormap no menu de figuras.

@horchler já mencionou isso, mas eu suponho que você não tenha ouvido falar sobre o editor de mapa de colors antes. Por isso, suspeito que a opção 3 seja a mais adequada para você.

pode-se tentar Recolor_contourf. Tem mais duas funções e é fácil de usar. Em sua ajuda, o exemplo dado a seguir. A function é submetida por mim. deixe-me saber se enfrentar qualquer problema

 X=1:10;Y=1:10; C=rand(10,10)*150; c=colormap(jet(7)); L=[10 20 50 60 70 100]; [cdd hc]=contourf(X,Y,C,[-5 L]); Recolor_contourf(hc,c,L,'vert'); 
Intereting Posts