Acessando o iterador do ciclo de cores
Não há método "voltado para o usuário" (também conhecido como "público") para acessar o iterador subjacente, mas você pode acessá-lo por meio de métodos "privados" (por convenção). No entanto, você não pode obter o estado de um iterator
sem alterá-lo.
Configurando o ciclo de cores
À parte rápida: Você pode definir o ciclo de cores / propriedades de várias maneiras (por exemplo, ax.set_color_cycle
nas versões <1.5 ou ax.set_prop_cycler
> = 1.5). Dê uma olhada no exemplo aqui para a versão 1.5 ou superior , ou o estilo anterior aqui .
Acessando o iterador subjacente
No entanto, embora não haja nenhum método voltado ao público para acessar o iterável, você pode acessá-lo para um determinado objeto de eixos ( ax
) por meio da _get_lines
instância da classe auxiliar. ax._get_lines
é um toque com um nome confuso, mas é a maquinaria dos bastidores que permite ao plot
comando processar todas as formas estranhas e variadas que plot
podem ser chamadas. Entre outras coisas, é o que controla quais cores atribuir automaticamente. Da mesma forma, é ax._get_patches_for_fill
necessário controlar o ciclo pelas cores de preenchimento padrão e propriedades de patch.
De qualquer forma, o ciclo de cores iterável é ax._get_lines.color_cycle
para linhas e ax._get_patches_for_fill.color_cycle
patches. Em matplotlib> = 1.5, isso mudou para usar a cycler
biblioteca , e o iterável é chamado em prop_cycler
vez de color_cycle
e produz um dict
de propriedades em vez de apenas uma cor.
Resumindo, você faria algo como:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
color_cycle = ax._get_lines.color_cycle
Você não pode ver o estado de um iterator
No entanto, este objeto é um "vazio" iterator
. Podemos facilmente obter o próximo item (por exemplo next_color = next(color_cycle)
, mas isso significa que a próxima cor depois disso é a que será plotada. Por design, não há como obter o estado atual de um iterador sem alterá-lo.
Em v1.5
ou superior, seria bom pegar o cycler
objeto que está sendo usado, pois poderíamos inferir seu estado atual. No entanto, o cycler
próprio objeto não está acessível (pública ou privada) em qualquer lugar. Em vez disso, apenas a itertools.cycle
instância criada a partir do cycler
objeto está acessível. De qualquer maneira, não há como chegar ao estado subjacente do ciclador de cor / propriedade.
Em vez disso, combine a cor do item traçado anteriormente
No seu caso, parece que você deseja combinar a cor de algo que acabou de ser plotado. Em vez de tentar determinar qual será a cor / propriedade, defina a cor / etc do seu novo item com base nas propriedades do que está plotado.
Por exemplo, no caso que você descreveu, eu faria algo assim:
import matplotlib.pyplot as plt
import numpy as np
def custom_plot(x, y, **kwargs):
ax = kwargs.pop('ax', plt.gca())
base_line, = ax.plot(x, y, **kwargs)
ax.fill_between(x, 0.9*y, 1.1*y, facecolor=base_line.get_color(), alpha=0.5)
x = np.linspace(0, 1, 10)
custom_plot(x, x)
custom_plot(x, 2*x)
custom_plot(x, -x, color='yellow', lw=3)
plt.show()

Não é a única maneira, mas é mais limpa do que tentar obter a cor da linha traçada de antemão, neste caso.