Matplotlib SVG Filter Line

PythonPythonBeginner
Practicar Ahora

This tutorial is from open-source community. Access the source code

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Esta práctica demuestra cómo utilizar los efectos de filtrado SVG con Matplotlib. Los efectos de filtrado solo son efectivos si su renderizador SVG los soporta.

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.

Importar las bibliotecas necesarias

En primer lugar, necesitamos importar las bibliotecas necesarias: matplotlib.pyplot, io y xml.etree.ElementTree.

import io
import xml.etree.ElementTree as ET
import matplotlib.pyplot as plt
import matplotlib.transforms as mtransforms

Crear una figura y un eje

Creamos un objeto figura con plt.figure() y agregamos un objeto eje usando fig1.add_axes(). También establecemos el tamaño y la posición del eje usando [0.1, 0.1, 0.8, 0.8].

fig1 = plt.figure()
ax = fig1.add_axes([0.1, 0.1, 0.8, 0.8])

Dibujar líneas

Dibujamos dos líneas usando ax.plot(). También personalizamos las líneas con diferentes colores, marcadores y etiquetas.

l1, = ax.plot([0.1, 0.5, 0.9], [0.1, 0.9, 0.5], "bo-", mec="b", lw=5, ms=10, label="Line 1")
l2, = ax.plot([0.1, 0.5, 0.9], [0.5, 0.2, 0.7], "rs-", mec="r", lw=5, ms=10, label="Line 2")

Dibujar sombras

Dibujamos sombras para las líneas utilizando las mismas líneas con un ligero desplazamiento y colores grises. Ajustamos el color y el zorder de las líneas de sombra para que se dibujen por debajo de las líneas originales. También utilizamos el método offset_copy() para crear una transformación de desplazamiento para las líneas de sombra.

for l in [l1, l2]:
    xx = l.get_xdata()
    yy = l.get_ydata()
    shadow, = ax.plot(xx, yy)
    shadow.update_from(l)

    shadow.set_color("0.2")
    shadow.set_zorder(l.get_zorder() - 0.5)

    transform = mtransforms.offset_copy(l.get_transform(), fig1, x=4.0, y=-6.0, units='points')
    shadow.set_transform(transform)

    shadow.set_gid(l.get_label() + "_shadow")

Establecer límites del eje y guardar la figura

Establecemos los límites x e y para el eje y guardamos la figura como una cadena de bytes en formato SVG utilizando io.BytesIO() y plt.savefig().

ax.set_xlim(0., 1.)
ax.set_ylim(0., 1.)

f = io.BytesIO()
plt.savefig(f, format="svg")

Definir filtro

Definimos un filtro para un desenfoque gaussiano utilizando las etiquetas <defs> y <filter> con el atributo stdDeviation.

filter_def = """
  <defs xmlns='http://www.w3.org/2000/svg'
        xmlns:xlink='http://www.w3.org/1999/xlink'>
    <filter id='dropshadow' height='1.2' width='1.2'>
      <feGaussianBlur result='blur' stdDeviation='3'/>
    </filter>
  </defs>
"""

Leer y modificar SVG

Leemos el SVG guardado utilizando ET.XMLID() e insertamos la definición del filtro en el árbol DOM del SVG utilizando tree.insert(). Luego, recuperamos el elemento SVG con el ID dado y aplicamos el filtro de sombra utilizando shadow.set().

tree, xmlid = ET.XMLID(f.getvalue())

tree.insert(0, ET.XML(filter_def))

for l in [l1, l2]:
    shadow = xmlid[l.get_label() + "_shadow"]
    shadow.set("filter", 'url(#dropshadow)')

fn = "svg_filter_line.svg"
print(f"Guardando '{fn}'")
ET.ElementTree(tree).write(fn)

Resumen

Esta práctica demostró cómo utilizar los efectos de filtrado de SVG con Matplotlib. Aprendimos cómo crear una figura y un eje, dibujar líneas y sombras, establecer los límites del eje y definir y aplicar filtros a un SVG.