Linha de Filtro SVG com Matplotlib

Beginner

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

Introdução

Este laboratório demonstra como usar efeitos de filtragem SVG com Matplotlib. Os efeitos de filtragem são eficazes apenas se o seu renderizador SVG os suportar.

Dicas da VM

Após a inicialização da VM, clique no canto superior esquerdo para mudar para a aba Notebook e acessar o Jupyter Notebook para praticar.

Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão, e resolveremos o problema prontamente para você.

Importar Bibliotecas Necessárias

Primeiramente, precisamos importar as bibliotecas necessárias: matplotlib.pyplot, io e xml.etree.ElementTree.

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

Criar uma Figura e Eixos

Criamos um objeto figura com plt.figure() e adicionamos um objeto eixos usando fig1.add_axes(). Também definimos o tamanho e a posição dos eixos usando [0.1, 0.1, 0.8, 0.8].

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

Desenhar Linhas

Desenhamos duas linhas usando ax.plot(). Também personalizamos as linhas com diferentes cores, marcadores e rótulos.

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")

Desenhar Sombras

Desenhamos sombras para as linhas usando as mesmas linhas com um ligeiro deslocamento e cores cinza. Ajustamos a cor e a zorder das linhas de sombra para que sejam desenhadas abaixo das linhas originais. Também usamos o método offset_copy() para criar uma transformação de deslocamento para as linhas 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")

Definir Limites dos Eixos e Salvar a Figura

Definimos os limites x e y para os eixos e salvamos a figura como uma string de bytes no formato SVG usando io.BytesIO() e plt.savefig().

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

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

Definir Filtro

Definimos um filtro para um desfoque Gaussiano usando as tags <defs> e <filter> com o 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>
"""

Ler e Modificar SVG

Lemos o SVG salvo usando ET.XMLID() e inserimos a definição do filtro na árvore DOM do SVG usando tree.insert(). Em seguida, selecionamos o elemento SVG com o ID fornecido e aplicamos o filtro de sombra usando 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"Saving '{fn}'")
ET.ElementTree(tree).write(fn)

Resumo

Este laboratório demonstrou como usar efeitos de filtragem SVG com Matplotlib. Aprendemos como criar uma figura e eixos, desenhar linhas e sombras, definir limites de eixos e definir e aplicar filtros a um SVG.