Tooltip SVG no Matplotlib

Beginner

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

Introdução

Este laboratório é um tutorial passo a passo sobre como criar uma dica de ferramenta (tooltip) que aparecerá ao passar o mouse sobre um patch do matplotlib. Criaremos a dica de ferramenta no matplotlib e simplesmente alternaremos sua visibilidade ao passar o mouse sobre o patch. Essa abordagem oferece controle total sobre o posicionamento e a aparência da dica de ferramenta, à custa de mais código inicial.

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ê.

Criar os patches

Primeiramente, criamos os patches aos quais as dicas de ferramenta serão atribuídas.

rect1 = plt.Rectangle((10, -20), 10, 5, fc='blue')
rect2 = plt.Rectangle((-20, 15), 10, 5, fc='green')

shapes = [rect1, rect2]
labels = ['This is a blue rectangle.', 'This is a green rectangle']

Adicionar patches e anotações de dica de ferramenta

Em seguida, adicionamos os patches e as anotações de dica de ferramenta ao gráfico. As anotações de dica de ferramenta são criadas usando o método annotate. Definimos o parâmetro xy para as coordenadas do patch e xytext para (0, 0) para posicionar a dica de ferramenta diretamente sobre o patch. Também definimos o parâmetro textcoords para 'offset points' para alinhar a dica de ferramenta com o patch. Definimos o parâmetro color para 'w' para tornar o texto branco, ha para 'center' para centralizar o texto horizontalmente, fontsize para 8 para definir o tamanho da fonte e bbox para definir o estilo da caixa da dica de ferramenta.

for i, (item, label) in enumerate(zip(shapes, labels)):
    patch = ax.add_patch(item)
    annotate = ax.annotate(labels[i], xy=item.get_xy(), xytext=(0, 0),
                           textcoords='offset points', color='w', ha='center',
                           fontsize=8, bbox=dict(boxstyle='round, pad=.5',
                                                 fc=(.1, .1, .1, .92),
                                                 ec=(1., 1., 1.), lw=1,
                                                 zorder=1))

    ax.add_patch(patch)
    patch.set_gid(f'mypatch_{i:03d}')
    annotate.set_gid(f'mytooltip_{i:03d}')

Salvar a figura como SVG

Salvamos a figura em um objeto de arquivo falso usando a classe BytesIO e o método savefig.

ax.set_xlim(-30, 30)
ax.set_ylim(-30, 30)
ax.set_aspect('equal')

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

Adicionar interatividade

Adicionamos interatividade ao gráfico criando uma dica de ferramenta que será ativada e desativada ao passar o mouse sobre os patches. Fazemos isso criando uma árvore XML a partir do arquivo SVG, ocultando as dicas de ferramenta e atribuindo callbacks onmouseover e onmouseout aos patches. Também definimos as funções ShowTooltip e HideTooltip que serão chamadas ao passar o mouse sobre os patches.

tree, xmlid = ET.XMLID(f.getvalue())
tree.set('onload', 'init(event)')

for i in shapes:
    ## Get the index of the shape
    index = shapes.index(i)
    ## Hide the tooltips
    tooltip = xmlid[f'mytooltip_{index:03d}']
    tooltip.set('visibility', 'hidden')
    ## Assign onmouseover and onmouseout callbacks to patches.
    mypatch = xmlid[f'mypatch_{index:03d}']
    mypatch.set('onmouseover', "ShowTooltip(this)")
    mypatch.set('onmouseout', "HideTooltip(this)")

## This is the script defining the ShowTooltip and HideTooltip functions.
script = """
    <script type="text/ecmascript">
    <![CDATA[

    function init(event) {
        if ( window.svgDocument == null ) {
            svgDocument = event.target.ownerDocument;
            }
        }

    function ShowTooltip(obj) {
        var cur = obj.id.split("_")[1];
        var tip = svgDocument.getElementById('mytooltip_' + cur);
        tip.setAttribute('visibility', "visible")
        }

    function HideTooltip(obj) {
        var cur = obj.id.split("_")[1];
        var tip = svgDocument.getElementById('mytooltip_' + cur);
        tip.setAttribute('visibility', "hidden")
        }

    ]]>
    </script>
    """

## Insert the script at the top of the file and save it.
tree.insert(0, ET.XML(script))
ET.ElementTree(tree).write('svg_tooltip.svg')

Resumo

Neste laboratório, aprendemos como criar uma dica de ferramenta (tooltip) que aparecerá ao passar o mouse sobre um patch do matplotlib. Criamos a dica de ferramenta no matplotlib e simplesmente alternamos sua visibilidade para ativada ao passar o mouse sobre o patch. Também adicionamos interatividade ao gráfico criando uma dica de ferramenta que será ativada e desativada ao passar o mouse sobre os patches.