Nota
Haga clic aquí para descargar el código de ejemplo completo
Guía de efectos de ruta #
Definición de rutas que siguen los objetos en un lienzo.
El módulo de Matplotlib patheffects
proporciona funcionalidad para aplicar una etapa de dibujo múltiple a cualquier artista que se pueda representar a través de un archivo path.Path
.
Los artistas a los que se les puede aplicar un efecto de ruta incluyen patches.Patch
,
lines.Line2D
e collections.Collection
incluso text.Text
. Los efectos de ruta de cada artista se pueden controlar a través del Artist.set_path_effects
método, que requiere una iteración de AbstractPathEffect
instancias.
El efecto de ruta más simple es el Normal
efecto, que simplemente dibuja al artista sin ningún efecto:
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()
Si bien la trama no se ve diferente de lo que esperaría sin ningún efecto de ruta, el dibujo del texto ahora se ha cambiado para usar el marco de efectos de ruta, lo que abre las posibilidades de ejemplos más interesantes.
Agregar una sombra #
Un efecto de ruta mucho más interesante que Normal
la sombra paralela, que podemos aplicar a cualquiera de nuestros artistas basados en rutas. Las clases SimplePatchShadow
y SimpleLineShadow
hacen precisamente esto dibujando un parche relleno o un parche de línea debajo del 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 los dos enfoques para configurar los efectos de ruta en este ejemplo. El primero usa las with*
clases para incluir la funcionalidad deseada seguida automáticamente con el efecto "normal", mientras que el último define explícitamente los dos efectos de ruta a dibujar.
Hacer que un artista se destaque #
Una buena manera de hacer que los artistas se destaquen visualmente es dibujar un contorno en un color llamativo debajo del artista real. El Stroke
efecto de ruta hace que esta sea una tarea relativamente simple:
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()
Es importante notar que este efecto solo funciona porque hemos dibujado la ruta del texto dos veces; una vez con una línea negra gruesa y luego una vez con la ruta de texto original en la parte superior.
Es posible que haya notado que las palabras clave para Stroke
y SimplePatchShadow
y SimpleLineShadow
no son las palabras clave habituales de los artistas ( facecolor
edgecolor , etc.). Esto se debe a que con estos efectos de ruta estamos operando en un nivel más bajo de Matplotlib. De hecho, las palabras clave que se aceptan son las de una matplotlib.backend_bases.GraphicsContextBase
instancia, que han sido diseñadas para facilitar la creación de nuevos backends, y no para su interfaz de usuario.
Mayor control del artista del efecto de ruta #
Como ya se mencionó, algunos de los efectos de ruta operan a un nivel más bajo que el que la mayoría de los usuarios están acostumbrados, lo que significa que establecer palabras clave como
color de cara y color de borde genera un AttributeError. Afortunadamente, existe un PathPatchEffect
efecto de ruta genérico que crea una patches.PathPatch
clase con la ruta original. Las palabras clave a este efecto son idénticas a las 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()