Matplotlib SVG Tooltip

PythonPythonBeginner
Jetzt üben

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

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Dieses Tutorial ist ein Schritt-für-Schritt-Anleitung dazu, wie man einen Tooltip erstellt, der beim Hovern über einen matplotlib-Patch erscheint. Wir werden den Tooltip in matplotlib erstellen und seine Sichtbarkeit einfach beim Hovern über den Patch umschalten. Dieser Ansatz bietet volle Kontrolle über die Tooltip-Positionierung und -Erscheinung, allerdings auf Kosten von mehr Code im Voraus.

Tipps für die VM

Nachdem der VM-Start abgeschlossen ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.

Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund von Einschränkungen in Jupyter Notebook nicht automatisiert werden.

Wenn Sie bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.

Erstellen der Patches

Wir erstellen zuerst die Patches, denen die Tooltips zugewiesen werden sollen.

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']

Fügen Sie Patches und Tooltip-Anmerkungen hinzu

Wir fügen dann die Patches und die Tooltip-Anmerkungen zum Graphen hinzu. Die Tooltip-Anmerkungen werden mit der annotate-Methode erstellt. Wir legen den xy-Parameter auf die Koordinaten des Patches und xytext auf (0, 0) fest, um den Tooltip direkt über dem Patch zu positionieren. Wir legen auch den textcoords-Parameter auf 'offset points' fest, um den Tooltip mit dem Patch auszurichten. Wir legen den color-Parameter auf 'w' fest, um den Text weiß zu machen, ha auf 'center' fest, um den Text horizontal zentriert zu positionieren, fontsize auf 8 fest, um die Schriftgröße einzustellen und bbox fest, um den Stil der Tooltip-Box zu setzen.

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}')

Speichern der Abbildung als SVG

Wir speichern die Abbildung in einem gefälschten Dateiobjekt mithilfe der BytesIO-Klasse und der savefig-Methode.

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

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

Interaktivität hinzufügen

Wir fügen Interaktivität zum Graphen hinzu, indem wir einen Tooltip erstellen, der beim Hovern über die Patches eingeschaltet und ausgeschaltet wird. Wir tun dies, indem wir einen XML-Baum aus der SVG-Datei erstellen, die Tooltips ausblenden und onmouseover- und onmouseout-Callbacks den Patches zuweisen. Wir definieren auch die ShowTooltip- und HideTooltip-Funktionen, die beim Hovern über die Patches aufgerufen werden.

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

Zusammenfassung

In diesem Lab haben wir gelernt, wie man einen Tooltip erstellt, der beim Hovern über einen matplotlib-Patch angezeigt wird. Wir haben den Tooltip in matplotlib erstellt und seine Sichtbarkeit einfach beim Hovern über den Patch umgeschaltet. Wir haben auch Interaktivität zum Graphen hinzugefügt, indem wir einen Tooltip erstellt haben, der beim Hovern über die Patches eingeschaltet und ausgeschaltet wird.