Traçar automaticamente diferentes linhas coloridas
-
19-09-2019 - |
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
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:
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)