Pergunta

Estou tentando plotar várias estimativas de densidade do kernel no mesmo gráfico, e quero que todas sejam cores diferentes. Eu tenho uma solução kludged usando uma string 'rgbcmyk' e passando por cada enredo separado, mas começo a duplicar após 7 iterações. Existe uma maneira mais fácil/mais 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
Foi útil?

Solução

Você pode usar um mapa de coloras 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 coloridas diferentes diferentes ('Doc Colormap' lista todos eles).

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

Outras dicas

Na verdade, um método de atalho decente para fazer as cores pedalar é usar hold all; no lugar de hold on;. Cada um sucessivo plot Gotará (automaticamente para você) através do Colormap padrão do MATLAB.

Do site do MATLAB em hold:

hold all Segura o gráfico e o estilo de cor e linha atual, para que os comandos subsequentes de plotagem não redefinam os valores de propriedades cororder e linestyleder para o início da lista. Os comandos de plotagem continuam andando de bicicleta pelas cores e linheiros predefinidos de onde o último enredo parou na lista.

Resposta tardia, mas duas coisas a acrescentar:

  • Para obter informações sobre como alterar o 'ColorOrder' propriedade e como definir um padrão global com 'DefaultAxesColorOrder', veja o "Apêndice" na parte inferior deste post.
  • Existe uma ótima ferramenta na troca de arquivos centrais do MATLAB para gerar qualquer número de cores visualmente distintas, se você tiver a caixa de ferramentas de processamento de imagem para usá -la. Leia para obter detalhes.

o ColorOrder axes propriedade permite que o MATLAB percorre automaticamente uma lista de cores ao usar hold on/all (novamente, veja o Apêndice abaixo para como fazer set/get a ColorOrder para um eixo específico ou globalmente via DefaultAxesColorOrder). No entanto, por padrão O MATLAB especifica apenas uma pequena lista de cores (apenas 7 A partir de r2013b) Para pedalar e, por outro lado, pode ser problemático encontrar um bom conjunto de cores para mais séries de dados. Para 10 parcelas, você obviamente não pode confiar no padrão ColorOrder.

Uma ótima maneira de Defina n cores visualmente distintas está com o "Gere o envio de cores mais distintas perceptivas" (GMPDC) na troca de arquivos do 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 "laboratório", que corresponde mais de perto à percepção de cores humanas que o RGB. Dada uma grande lista inicial de cores possíveis, ele escolhe iterativamente a entrada na lista mais distante (no espaço do laboratório) de todas as entradas escolhidas anteriormente.

Por exemplo, quando 25 cores são solicitadas:

25 "maximally perceptually-distinct colors"

A submissão do GMPDC foi escolhida 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 as 7 cores padrão do Matlab). Eles até fizeram a excelente sugestão para definir o Matlab's ColorOrder na startup para,

distinguishable_colors(20)

Claro, você pode definir o ColorOrder Para um único eixo ou simplesmente gerar uma lista de cores para usar da maneira que desejar. Por exemplo, para gerar 10 "cores de distinto perceptivamente no máximo e usá-las para 10 parcelas no mesmo eixo (mas não usando 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, exigindo não for loop, com o ColorOrder propriedade do eixo:

% X of size N-by-P-by-2
mpdc10 = distinguishable_colors(10)
ha = axes; hold(ha,'on')
set(ha,'ColorOrder',mpdc10)    % --- Defina o Colororder aqui ---
plot(X(:,:,1),X(:,:,2),'-.')   % Loop não necessário, 'cor' não é necessário. Yay!

APÊNDICE

Para obter o ColorOrder Array RGB usado para o eixo atual,

get(gca,'ColorOrder')

Para obter o padrão ColorOrder Para novos eixos,

get(0,'DefaultAxesColorOrder')

Exemplo de definir novo global ColorOrder com 10 cores no início do matlab, em startup.m:

set(0,'DefaultAxesColorOrder',distinguishable_colors(10))

Atrasado para a festa. Eu estava olhando para isso e acabei de encontrar sobre essa opção de eixos chamada colororder Você pode especificar a ordem de cores da sessão ou apenas para a figura e, em seguida, traçar uma matriz e deixar o Matlab pedalar automaticamente pelas cores especificadas.

Vejo Alterando o colororder padrão

exemplo

set(0,'DefaultAxesColorOrder',jet(5))
A=rand(10,5);
plot(A);

Se todos os vetores tiverem tamanho igual, crie uma matriz e plote -a. Cada coluna é plotada com uma cor diferente automaticamente, então você pode usar legend Para indicar colunas:

data = randn(100, 5);

figure;
plot(data);

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

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

legend(names)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top