O Matplotlib faz isso por padrão.
Por exemplo:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)
plt.show()
E, como você já deve saber, você pode facilmente adicionar uma legenda:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)
plt.legend(['y = x', 'y = 2x', 'y = 3x', 'y = 4x'], loc='upper left')
plt.show()
Se você deseja controlar as cores que serão percorridas:
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
plt.gca().set_color_cycle(['red', 'green', 'blue', 'yellow'])
plt.plot(x, x)
plt.plot(x, 2 * x)
plt.plot(x, 3 * x)
plt.plot(x, 4 * x)
plt.legend(['y = x', 'y = 2x', 'y = 3x', 'y = 4x'], loc='upper left')
plt.show()
Se você não estiver familiarizado com o matplotlib, o tutorial é um bom lugar para começar .
Editar:
Primeiro, se você tiver muitas (> 5) coisas que deseja traçar em uma figura, também:
- Coloque-os em gráficos diferentes (considere usar algumas sub-gráficos em uma figura) ou
- Use algo diferente de cor (por exemplo, estilos de marcador ou espessura de linha) para distinguir entre eles.
Caso contrário, você vai acabar com uma trama muito confusa! Seja legal com quem vai ler o que estiver fazendo e não tente colocar 15 coisas diferentes em uma única figura !!
Além disso, muitas pessoas são daltônicas em graus variados, e é difícil distinguir entre várias cores sutilmente diferentes para mais pessoas do que você imagina.
Dito isto, se você realmente deseja colocar 20 linhas em um eixo com 20 cores relativamente distintas, aqui está uma maneira de fazê-lo:
import matplotlib.pyplot as plt
import numpy as np
num_plots = 20
# Have a look at the colormaps here and decide which one you'd like:
# http://matplotlib.org/1.2.1/examples/pylab_examples/show_colormaps.html
colormap = plt.cm.gist_ncar
plt.gca().set_prop_cycle(plt.cycler('color', plt.cm.jet(np.linspace(0, 1, num_plots))))
# Plot several different functions...
x = np.arange(10)
labels = []
for i in range(1, num_plots + 1):
plt.plot(x, i * x + 5 * i)
labels.append(r'$y = %ix + %i$' % (i, 5*i))
# I'm basically just demonstrating several different legend options here...
plt.legend(labels, ncol=4, loc='upper center',
bbox_to_anchor=[0.5, 1.1],
columnspacing=1.0, labelspacing=0.0,
handletextpad=0.0, handlelength=1.5,
fancybox=True, shadow=True)
plt.show()
set_color_cycle
foi descontinuado, de modo que a linha deve serplt.gca().set_prop_cycle(plt.cycler('color', plt.cm.jet(np.linspace(0, 1, num_plots))))
e apenas alterá-laplt.cm.YOUR_PREFERED_COLOR_MAP
para atender às suas necessidades.axes
) e perguntei sobre a variação da cor de uma única linha em diferentes plotagens (diferentesaxes
) ... Dito isto, excelente resposta a uma importante pergunta (possivelmente diferente do que OP perguntou, mas ninguém pode dizer porque eles pediram esta única pergunta e desapareceu!) - 1Configurando-os mais tarde
Se você não souber o número de plotagens que deseja plotar, poderá alterar as cores depois de plotá-las, recuperando o número diretamente da plotagem usando
.lines
, use esta solução:Alguns dados aleatórios
O trecho de código que você precisa:
O resultado é o seguinte:
fonte
TL; DR Não, isso não pode ser feito automaticamente . Sim, é possível.
Cada plotagem (
axes
) em uma figura (figure
) tem seu próprio ciclo de cores - se você não forçar uma cor diferente para cada plotagem, todas as plotagens compartilham a mesma ordem de cores, mas, se esticarmos um pouco o que "automaticamente" significa , pode ser feito.O OP escreveu
Mas ... Matplotlib gera automaticamente cores diferentes para cada curva diferente
Então, por que o pedido de OP? Se continuarmos a ler, temos
e faz sentido, porque cada trama (cada uma
axes
na linguagem de Matplotlib) tem a suacolor_cycle
(ou melhor, em 2018prop_cycle
) e cada trama (axes
) reutiliza as mesmas cores na mesma ordem.Se esse é o significado da pergunta original, uma possibilidade é nomear explicitamente uma cor diferente para cada gráfico.
Se as plotagens (como geralmente acontecem) forem geradas em um loop, precisamos ter uma variável de loop adicional para substituir a cor escolhida automaticamente pelo Matplotlib.
Outra possibilidade é instanciar um objeto cycler
Note que
type(my_cycler)
écycler.Cycler
mastype(actual_cycler)
éitertools.cycle
.fonte
Eu gostaria de oferecer uma pequena melhoria na última resposta do loop fornecida no post anterior (esse post está correto e ainda deve ser aceito). A suposição implícita feita ao rotular o último exemplo é que
plt.label(LIST)
coloca o número da etiqueta X naLIST
linha correspondente à décima vez em queplot
foi chamado. Eu já tive problemas com essa abordagem antes. A maneira recomendada de criar legendas e personalizar seus rótulos de acordo com a documentação do matplotlibs ( http://matplotlib.org/users/legend_guide.html#adjusting-the-order-of-legend-item ) é ter uma sensação calorosa de que os rótulos juntamente com os gráficos exatos que você acha que eles fazem:**: Matplotlib Legends não está funcionando
fonte