Observação
Clique aqui para baixar o código de exemplo completo
Guia de efeitos de caminho #
Definir caminhos que os objetos seguem em uma tela.
O módulo do Matplotlib patheffectsfornece funcionalidade para aplicar um estágio de desenho múltiplo a qualquer artista que pode ser renderizado por meio de um arquivo path.Path.
Artistas que podem ter um efeito de caminho aplicado a eles incluem patches.Patch,
lines.Line2De collections.Collectionaté mesmo text.Text. Os efeitos do caminho de cada artista podem ser controlados por meio do Artist.set_path_effectsmétodo, que requer uma iteração de AbstractPathEffectinstâncias.
O efeito de caminho mais simples é o Normalefeito, que simplesmente desenha o artista sem nenhum efeito:
import matplotlib.pyplot as plt
import matplotlib.patheffects as path_effects
fig = plt.figure(figsize=(5, 1.5))
text = fig.text(0.5, 0.5, 'Hello path effects world!\nThis is the normal '
'path effect.\nPretty dull, huh?',
ha='center', va='center', size=20)
text.set_path_effects([path_effects.Normal()])
plt.show()

Embora o enredo não pareça diferente do que você esperaria sem nenhum efeito de caminho, o desenho do texto agora foi alterado para usar a estrutura de efeitos de caminho, abrindo possibilidades para exemplos mais interessantes.
Adicionando uma sombra #
Um efeito de caminho muito mais interessante do que Normala sombra projetada, que podemos aplicar a qualquer um de nossos artistas baseados em caminhos. As classes SimplePatchShadow
e SimpleLineShadowfazem exatamente isso desenhando um patch preenchido ou um patch de linha abaixo do artista original:
import matplotlib.patheffects as path_effects
text = plt.text(0.5, 0.5, 'Hello path effects world!',
path_effects=[path_effects.withSimplePatchShadow()])
plt.plot([0, 3, 2, 5], linewidth=5, color='blue',
path_effects=[path_effects.SimpleLineShadow(),
path_effects.Normal()])
plt.show()

Observe as duas abordagens para definir os efeitos de caminho neste exemplo. O primeiro usa as with*classes para incluir a funcionalidade desejada automaticamente seguida do efeito "normal", enquanto o último define explicitamente os dois efeitos de caminho a serem desenhados.
Fazendo um artista se destacar #
Uma boa maneira de fazer os artistas se destacarem visualmente é desenhar um contorno em uma cor ousada abaixo do artista real. O Strokeefeito de caminho torna esta tarefa relativamente simples:
fig = plt.figure(figsize=(7, 1))
text = fig.text(0.5, 0.5, 'This text stands out because of\n'
'its black border.', color='white',
ha='center', va='center', size=30)
text.set_path_effects([path_effects.Stroke(linewidth=3, foreground='black'),
path_effects.Normal()])
plt.show()

É importante observar que esse efeito só funciona porque desenhamos o caminho do texto duas vezes; uma vez com uma linha preta grossa e, em seguida, uma vez com o caminho do texto original no topo.
Você deve ter notado que as palavras-chave to Strokee SimplePatchShadow
e SimpleLineShadownão são as palavras-chave usuais do Artista ( facecolor
edgecolor , etc.). Isso ocorre porque, com esses efeitos de caminho, estamos operando no nível inferior do Matplotlib. Na verdade, as palavras-chave aceitas são as de uma matplotlib.backend_bases.GraphicsContextBaseinstância, que foram projetadas para facilitar a criação de novos back-ends - e não para sua interface de usuário.
Maior controle do artista de efeito de caminho #
Como já mencionado, alguns dos efeitos de caminho operam em um nível mais baixo do que a maioria dos usuários está acostumado, o que significa que definir palavras-chave como
facecolor e edgecolor gera um AttributeError. Felizmente existe um PathPatchEffectefeito de caminho genérico que cria uma patches.PathPatch
classe com o caminho original. As palavras-chave para este efeito são idênticas às de patches.PathPatch:
fig = plt.figure(figsize=(8.5, 1))
t = fig.text(0.02, 0.5, 'Hatch shadow', fontsize=75, weight=1000, va='center')
t.set_path_effects([
path_effects.PathPatchEffect(
offset=(4, -4), hatch='xxxx', facecolor='gray'),
path_effects.PathPatchEffect(
edgecolor='white', linewidth=1.1, facecolor='black')])
plt.show()