Matplotlib Kreisdiagrammfilter

Beginner

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

Einführung

In diesem Lab werden wir demonstrieren, wie Filtereffekte mit dem Kreisdiagramm von Matplotlib verwendet werden. Wir werden den Code für das Zeichnen des Kreisdiagramms, der aus pie_demo.py entnommen wurde, verwenden und Filtereffekte auf das Diagramm anwenden. Die Filtereffekte sind nur dann wirksam, wenn Ihr SVG-Renderer sie unterstützt.

Tipps für die VM

Nachdem die VM gestartet 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 der 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 eines Kreisdiagramms

Wir werden eine quadratische Figur und Achsen für unser Kreisdiagramm erstellen. Wir werden die Labels und die Bruchteile für das Diagramm definieren. Wir werden auch die Ausbruchswerte für die Diagrammscheiben festlegen. Schließlich werden wir das Kreisdiagramm mit den definierten Parametern zeichnen.

import matplotlib.pyplot as plt
from matplotlib.patches import Shadow

fig = plt.figure(figsize=(6, 6))
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])

labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
fracs = [15, 30, 45, 10]
explode = (0, 0.05, 0, 0)

pies = ax.pie(fracs, explode=explode, labels=labels, autopct='%1.1f%%')

for w in pies[0]:
    w.set_gid(w.get_label())
    w.set_edgecolor("none")

for w in pies[0]:
    s = Shadow(w, -0.01, -0.01)
    s.set_gid(w.get_gid() + "_shadow")
    s.set_zorder(w.get_zorder() - 0.1)
    ax.add_patch(s)

plt.show()

Speichern des Diagramms als SVG

Wir werden das Kreisdiagramm als SVG-Datei speichern, indem wir die Module io und xml.etree.ElementTree verwenden. Wir werden die Filterdefinition für den Schatten mit einem Gaußschen Blur und einem Beleuchtungseffekt definieren. Der Beleuchtungsfilter wird von http://www.w3.org/TR/SVG/filters.html kopiert. Wir werden den Filter mit Inkscape und Firefox3 testen, beachten Sie jedoch, dass die Exportfunktion von Inkscape möglicherweise nicht unterstützt.

import io
import xml.etree.ElementTree as ET

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

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='2'/>
    </filter>

    <filter id='MyFilter' filterUnits='objectBoundingBox'
            x='0' y='0' width='1' height='1'>
      <feGaussianBlur in='SourceAlpha' stdDeviation='4%' result='blur'/>
      <feOffset in='blur' dx='4%' dy='4%' result='offsetBlur'/>
      <feSpecularLighting in='blur' surfaceScale='5' specularConstant='.75'
           specularExponent='20' lighting-color='#bbbbbb' result='specOut'>
        <fePointLight x='-5000%' y='-10000%' z='20000%'/>
      </feSpecularLighting>
      <feComposite in='specOut' in2='SourceAlpha'
                   operator='in' result='specOut'/>
      <feComposite in='SourceGraphic' in2='specOut' operator='arithmetic'
    k1='0' k2='1' k3='1' k4='0'/>
    </filter>
  </defs>
"""

tree, xmlid = ET.XMLID(f.getvalue())
tree.insert(0, ET.XML(filter_def))

for i, pie_name in enumerate(labels):
    pie = xmlid[pie_name]
    pie.set("filter", 'url(#MyFilter)')

    shadow = xmlid[pie_name + "_shadow"]
    shadow.set("filter", 'url(#dropshadow)')

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

Betrachten des Kreisdiagramms mit Filtereffekten

Wir werden das Kreisdiagramm mit den angewendeten Filtereffekten betrachten. Wir werden Inkscape verwenden, um die SVG-Datei zu öffnen und das Kreisdiagramm mit den Filtereffekten anzusehen.

Ändern des Kreisdiagramms mit unterschiedlichen Filtern

Wir können das Kreisdiagramm mit unterschiedlichen Filtern ändern, indem wir die Filterdefinition verändern. Wir können mit verschiedenen Filtern experimentieren, um verschiedene visuelle Effekte zu erzielen.

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='2'/>
    </filter>

    <filter id='MyFilter2' filterUnits='objectBoundingBox'
            x='0' y='0' width='1' height='1'>
      <feGaussianBlur in='SourceAlpha' stdDeviation='4%' result='blur'/>
      <feOffset in='blur' dx='4%' dy='4%' result='offsetBlur'/>
      <feSpecularLighting in='blur' surfaceScale='5' specularConstant='.75'
           specularExponent='20' lighting-color='#bbbbbb' result='specOut'>
        <fePointLight x='50%' y='50%' z='5000%'/>
      </feSpecularLighting>
      <feComposite in='specOut' in2='SourceAlpha'
                   operator='in' result='specOut'/>
      <feComposite in='SourceGraphic' in2='specOut' operator='arithmetic'
    k1='0' k2='1' k3='1' k4='0'/>
    </filter>
  </defs>
"""

tree, xmlid = ET.XMLID(f.getvalue())
tree.insert(0, ET.XML(filter_def))

for i, pie_name in enumerate(labels):
    pie = xmlid[pie_name]
    pie.set("filter", 'url(#MyFilter2)')

    shadow = xmlid[pie_name + "_shadow"]
    shadow.set("filter", 'url(#dropshadow)')

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

Zusammenfassung

In diesem Lab haben wir gelernt, wie man Filtereffekte mit dem Kreisdiagramm von Matplotlib verwendet. Wir haben ein Kreisdiagramm erstellt, es als SVG-Datei gespeichert und Filtereffekte auf das Diagramm angewendet. Wir haben auch das Kreisdiagramm mit unterschiedlichen Filtern geändert, um verschiedene visuelle Effekte zu erzielen.