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 patheffects
fornece 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.Line2D
e collections.Collection
até mesmo text.Text
. Os efeitos do caminho de cada artista podem ser controlados por meio do Artist.set_path_effects
método, que requer uma iteração de AbstractPathEffect
instâncias.
O efeito de caminho mais simples é o Normal
efeito, 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 Normal
a sombra projetada, que podemos aplicar a qualquer um de nossos artistas baseados em caminhos. As classes SimplePatchShadow
e SimpleLineShadow
fazem 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 Stroke
efeito 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 Stroke
e SimplePatchShadow
e SimpleLineShadow
nã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.GraphicsContextBase
instâ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 PathPatchEffect
efeito 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()