Altair-Beispiel

In Altair wird direkt die pattern-Funktionalität der SVG benutzt. Hier wird über die ID ein Pattern aus den SVG-defs ausgewählt.

1. Importe

Wir benötigen die Funktion display_html von IPython, um die SVGs inline in HTML integrieren zu können, damit sie später als Pattern in Altair verwendet werden können.

[1]:
from IPython.display import display_html

2. Einlesen und Dekodieren der SVG-Muster

Anschließend rufen wir die Funktion für unsere SVG auf und integrieren die Pattern in das HTML.

[2]:
def read_svg(svg_path):
    with open(svg_path, "rb") as svg_file:
        svg = svg_file.read().decode("utf-8")
    return svg


display_html(read_svg("../../../_static/pattern/cusypattern.svg"), raw=True)

3. pandas DataFrame für die Bereitstellung der Daten

[3]:
import altair as alt
import pandas as pd

data = pd.DataFrame(
    {
        "category": [
            "Purple",
            "Teal",
            "Orange",
            "Blue",
            "Red",
            "Cyan",
            "Magenta",
            "Green",
        ],
        "value": [90, 80, 50, 55, 50, 60, 40, 80],
        "pattern": [
            "pattern_0",
            "pattern_1",
            "pattern_2",
            "pattern_3",
            "pattern_4",
            "pattern_5",
            "pattern_6",
            "pattern_7",
        ],
    }
)

4. x- und y-Achsen definieren

Die x-Achse soll aus den Kategorien bestehen, die y-Achse aus den zugehörigen Werten.

Für altair.Fill wird die ID des jeweiligen SVG-Muster verwendet, um die Füllung festzulegen.

[4]:
chart = (
    alt.Chart(data, title="cusy Pattern Example", width=600, height=400)
    .mark_bar(stroke=None)
    .encode(
        x=alt.X(
            "category:N",
            sort=[
                "Purple",
                "Teal",
                "Orange",
                "Blue",
                "Red",
                "Cyan",
                "Magenta",
                "Green",
            ],
            axis=alt.Axis(title=None, labelAngle=0),
        ),
        y=alt.Y("value:Q", axis=alt.Axis(title=None)),
        fill=alt.Fill(
            "pattern:N",
            scale=alt.Scale(
                range=[
                    "url(#dotspattern)",
                    "url(#caretpattern)",
                    "url(#trianglepattern)",
                    "url(#spiralpattern)",
                    "url(#crosspattern)",
                    "url(#diamondpattern)",
                    "url(#squarepattern)",
                    "url(#tristarpattern)",
                ]
            ),
            legend=None,
        ),
    )
)

5. svg-Backend auswählen

[5]:
alt.renderers.set_embed_options(renderer="svg")

chart
[5]: