Plotar automaticamente linhas de cores diferentes

112

Estou tentando plotar várias estimativas de densidade de kernel no mesmo gráfico e quero que todas tenham cores diferentes. Eu tenho uma solução kludged usando uma string 'rgbcmyk'e percorrendo-a para cada plotagem separada, mas começo a ter duplicatas após 7 iterações. Existe uma maneira mais fácil / eficiente de fazer isso e com mais opções de cores?

for n=1:10
 source(n).data=normrnd(rand()*100,abs(rand()*50),100,1); %generate random data
end
cstring='rgbcmyk'; % color string
figure
hold on
for n=1:length(source)
 [f,x]=ksdensity(source(n).data); % calculate the distribution
 plot(x,f,cstring(mod(n,7)+1))  % plot with a different color each time
end
Doresoom
fonte
30
Você tentou simplesmente "segurar tudo"? Isso desenha automaticamente as cores das notícias para cada novo comando de plotagem.
twerdster
3
"segurar tudo" não é uma resposta à pergunta real, mas pode ser uma solução para muitas pessoas que terminam aqui, porque um mero "esperar" desenha todas as curvas em azul. Muito obrigado a @twerdster!
Rémi
8
A partir do R2014b , o usual hold oné funcionalmente equivalente a hold all. No entanto, a questão de como obter mais do que as 7 cores padrão permanece. Um mapa de cores padrão pode ser uma solução conforme descrito por Azim ou uma função para gerar cores ajustadas para facilitar a discriminação visual pode ser usada, conforme abaixo .
chappjc
1
Quando eu uso hold all, obtenho plotagens em cores diferentes (embora deva dizer que elas parecem muito opacas), enquanto quando eu uso hold on, todas as minhas plotagens ficam azuis. Então eu me pergunto o que é equivalência funcional.
HelloGoodbye
4
@HelloGoodbye No R2014b e mais recente, hold onfornece gráficos de cores diferentes. Você está usando uma versão mais antiga. Nos documentos atuais , " hold allé o mesmo que hold on. Observação: esta sintaxe será removida em uma versão futura. Use em seu hold onlugar." Veja também as notas de lançamento .
chappjc

Respostas:

131

Você pode usar um mapa de cores como o HSV para gerar um conjunto de cores. Por exemplo:

cc=hsv(12);
figure; 
hold on;
for i=1:12
    plot([0 1],[0 i],'color',cc(i,:));
end

O MATLAB tem 13 mapas de cores com nomes diferentes ( 'doc colormap' lista todos eles).

Outra opção para plotar linhas em cores diferentes é usar a propriedade LineStyleOrder ; consulte Definindo a cor das linhas para plotagem na documentação do MATLAB para obter mais informações.

Azim
fonte
Estava procurando por isso. Fique bem @Azim.
professor
Para o bem da posteridade, optei por aceitar esta resposta em vez da hold allsolução do @Mark Elliot devido à sua versatilidade de poder escolher mapas de cores diferentes.
Doresoom
Como posso fazê-lo funcionar usando o comando plot de "linha" em vez de plot?
Pedro77
106

Na verdade, um método de atalho decente para fazer as cores circularem é usar hold all;no lugar de hold on;. Cada sucessivoplot irá girar (automaticamente para você) através do mapa de cores padrão do MATLAB.

Do site do MATLAB em hold:

hold allmantém a plotagem e a cor e estilo de linha atuais para que os comandos de plotagem subsequentes não redefinam os valores das propriedades ColorOrder e LineStyleOrder para o início da lista. Os comandos de plotagem continuam percorrendo as cores e estilos de linha predefinidos de onde a última plotagem parou na lista.

Mark Elliot
fonte
36

Resposta tardia, mas duas coisas a acrescentar:

  • Para obter informações sobre como alterar a 'ColorOrder'propriedade e como definir um padrão global com 'DefaultAxesColorOrder', consulte o "Apêndice" na parte inferior desta postagem.
  • Há uma ótima ferramenta no MATLAB Central File Exchange para gerar qualquer número de cores visualmente distintas, se você tiver a Caixa de ferramentas de processamento de imagem para usá-la. Leia mais detalhes.

A ColorOrder axespropriedade permite MATLAB para alternar automaticamente através de uma lista de cores ao usar hold on/all(novamente, consulte o Apêndice abaixo como set/ geto ColorOrderpara um eixo específico ou globalmente via DefaultAxesColorOrder). No entanto, por padrão, o MATLAB especifica apenas uma pequena lista de cores ( apenas 7 em R2013b) para percorrer e, por outro lado, pode ser problemático encontrar um bom conjunto de cores para mais séries de dados. Para 10 plotagens, você obviamente não pode confiar no padrão ColorOrder.

Uma ótima maneira de definir N cores visualmente distintas é com o envio "Gerar cores distintas ao máximo perceptualmente" (GMPDC) no MATLAB Central File Exchange . É melhor descrito nas próprias palavras do autor:

Esta função gera um conjunto de cores que são distinguíveis por referência ao espaço de cores "Lab" , que se aproxima mais da percepção de cor humana do que RGB. Dada uma grande lista inicial de cores possíveis, ele escolhe iterativamente a entrada na lista que está mais distante (no espaço do Laboratório) de todas as entradas previamente escolhidas.

Por exemplo, quando 25 cores são solicitadas:

25 "cores perceptualmente distintas ao máximo"

O envio do GMPDC foi escolhido no blog oficial do MathWorks como Escolha da Semana em 2010, em parte devido à capacidade de solicitar um número arbitrário de cores (em contraste com o MATLAB embutido em 7 cores padrão). Eles até fizeram a excelente sugestão de configurar o MATLAB ColorOrderna inicialização para,

distinguishable_colors(20)

Claro, você pode definir o ColorOrderpara um único eixo ou simplesmente gerar uma lista de cores para usar da maneira que desejar. Por exemplo, para gerar 10 "cores distintas no máximo perceptualmente" e usá-las para 10 plotagens no mesmo eixo ( mas sem usar ColorOrder, exigindo assim um loop ):

% Starting with X of size N-by-P-by-2, where P is number of plots
mpdc10 = distinguishable_colors(10) % 10x3 color list
hold on
for ii=1:size(X,2),
    plot(X(:,ii,1),X(:,ii,2),'.','Color',mpdc10(ii,:));
end

O processo é simplificado, sem necessidade de forloop, com a ColorOrderpropriedade axis :

% X do tamanho N-por-P-por-2
mpdc10 = distinguishable_colors (10)
ha = eixos; segure (ha, 'ligado')
set (ha, 'ColorOrder', mpdc10)% --- set ColorOrder AQUI ---
plot (X (:,:, 1), X (:,:, 2), '-.')% loop NÃO necessário, 'Cor' NÃO necessária. Yay!

APÊNDICE

Para obter a ColorOrdermatriz RGB usada para o eixo atual,

get(gca,'ColorOrder')

Para obter o padrão ColorOrderpara novos eixos,

get(0,'DefaultAxesColorOrder')

Exemplo de configuração de novo global ColorOrdercom 10 cores no início do MATLAB, em startup.m:

set(0,'DefaultAxesColorOrder',distinguishable_colors(10))
chappjc
fonte
2
Apenas uma observação: isso parece exigir a Caixa de ferramentas de processamento de imagem.
Doresoom
2
@Doresoom Obrigado pela informação. Eu atualizei a postagem.
chappjc
12

Atrasado para a festa. Eu estava investigando isso sozinho e acabei de descobrir sobre esta opção de eixos chamada ColorOrder, você pode especificar a ordem de cores para a sessão ou apenas para a figura e, em seguida, apenas plotar uma matriz e deixar o MATLAB percorrer automaticamente as cores especificadas.

consulte Mudando o ColorOrder padrão

exemplo

set(0,'DefaultAxesColorOrder',jet(5))
A=rand(10,5);
plot(A);
xquared
fonte
1
Para um eixo único:set(gca,'ColorOrder',jet(5));
Evgeni Sergeev
1
excelente apenas para informar sobre jet (número) que não requer nenhuma
caixa de
4

Se todos os vetores tiverem o mesmo tamanho, crie uma matriz e plote-a. Cada coluna é plotada com uma cor diferente automaticamente. Em seguida, você pode usar legendpara indicar colunas:

data = randn(100, 5);

figure;
plot(data);

legend(cellstr(num2str((1:size(data,2))')))

Ou, se você tiver uma célula com nomes de kernels, use

legend(names)
Serg
fonte