R

ReflexKR

Reflex-Dokumentation

Die Komponentenwerkstatt: Reflex' 100 Bibliotheksbausteine

·

Kursüberblick

Layout

·

Box

·

Flex

·

Stack

·

Grid

·

Container

·

Section

·

Center

·

Spacer

·

Separator

·

Card

·

Inset

·

Aspect Ratio

·

Fragment

Typografie

·

Text

·

Heading

·

Link

·

Code

·

Markdown

·

Blockquote

·

Quote

·

Strong

·

Em

·

Kbd

Formulare

·

Button

·

Input

·

Text Area

·

Checkbox

·

Switch

·

Radio Group

·

Select

·

Slider

·

Form

·

Upload

Datenanzeige

·

Badge

·

Avatar

·

Icon

·

Callout

·

List

·

Data List

·

Code Block

·

Progress

·

Spinner

·

Scroll Area

·

Moment

Auf- und Zuklappen

·

Tabs

·

Accordion

·

Segmented Control

Overlays

·

Tooltip

·

Popover

·

Hover Card

·

Dialog

·

Alert Dialog

·

Drawer

·

Dropdown Menu

·

Context Menu

·

Toast

Dynamisches Rendern

·

Cond

·

Match

·

Foreach

·

Auto Scroll

Medien

·

Image

·

Audio

·

Video

Tabellen und Datengrids

·

Table

·

Data Table

·

Data Editor

Diagramme

·

Area Chart

·

Bar Chart

·

Line Chart

·

Composed Chart

·

Pie Chart

·

Radar Chart

·

Radial Bar Chart

·

Scatter Chart

·

Funnel Chart

·

Treemap

·

Sankey Chart

·

Error Bar

Diagrammbausteine

·

Axis

·

Cartesian Grid

·

Chart Tooltip

·

Legend

·

Label

·

Reference

·

Brush

Andere Diagrammbibliotheken

·

Plotly

·

Pyplot

HTML-Elemente

·

HTML

·

HTML Text

·

HTML Layout

·

HTML Forms

·

HTML Media

·

HTML Tables

·

SVG

Weitere Werkzeuge

·

Theme

·

Skeleton

·

Clipboard

·

Html Embed

·

Script

·

Memo

Die Komponentenwerkstatt: Reflex' 100 Bibliotheksbausteine
Andere Diagrammbibliotheken

Pyplot

reflex_pyplot.pyplot

Offizielle Doku

Werkstattauftrag

Bitte unseren matplotlib-Plotcode aus dem Labor unverändert auf eine Webseite bringen, und bei Auswahl eines Produkts soll sich die Grafik ändern.

pyplot ist eine Komponente, die Matplotlib-Grafiken in einer Reflex-Oberfläche anzeigt. Sie steckt im separaten Paket reflex-pyplot. Übergibst du eine mit matplotlib.pyplot erstellte Figure, wird sie im Browser gezeichnet; Flask-Routen oder eine base64-Umwandlung des Bilds brauchst du nicht.

Die Beispiele auf dieser Seite stehen nur als Code da. Auf dieser Website sind matplotlib und reflex-pyplot nicht installiert. Um den Code unten in deiner App auszuführen, installierst du zuerst die beiden Pakete (je nach Beispiel auch numpy).

Was ist pyplot?

matplotlib.pyplot ist eine Sammlung von Funktionen, mit denen sich Matplotlib wie MATLAB bedienen lässt. Aufrufe wie plt.plot, plt.scatter und plt.bar fügen der Grafik nacheinander Linien, Balken, Text und Legenden hinzu. In einem Skript öffnest du am Ende mit plt.show() ein Fenster; in einer Reflex-App übergibst du die Figure an die pyplot-Komponente, und wenn sich der State ändert, wird neu gezeichnet.

Wann Matplotlib?

Gibt es schon matplotlib-Code in Jupyter-Notebooks, Forschungsskripten oder Datenpipelines, verwendest du ihn unverändert in der Web-App, statt ihn auf eine andere Diagrammbibliothek umzuschreiben.

  • Dashboards zur Datenanalyse: Notebook-Prototypen mit Steuerelementen versehen und teilen
  • Wissenschaftliche Berichte: publikationsreife Grafiken mit LaTeX-Text und feinem Styling
  • Monitoring von Machine Learning: Lernkurven, Konfusionsmatrizen, Merkmalsverteilungen
  • Finanzanalyse: Zeitreihen und Renditegrafiken
  • Ingenieurwerkzeuge: Simulationsergebnisse und Sensordaten

Für gewöhnliche Geschäftsdiagramme wie Balken, Linien und Kreise passen die in Reflex eingebauten Recharts-Diagramme (rx.recharts) besser, für interaktive und 3D-Grafiken zum Zoomen und Drehen rx.plotly.

Installation

Wer reflex-pyplot installiert, braucht auch matplotlib. Einige Beispiele unten verwenden zusätzlich numpy.

pip install reflex-pyplot
# in a project that uses uv
uv add reflex-pyplot

Grundlegende Verwendung

Du importierst mit from reflex_pyplot import pyplot und übergibst die Grafik (Figure) als erstes Kind. Weil sie als Bild gezeichnet wird, gibst du Bild-Attribute wie alt (Alternativtext), loading und decoding sowie width und height mit.

import matplotlib.pyplot as plt
import numpy as np
import reflex as rx
from reflex_pyplot import pyplot


def create_contour_plot():
    X, Y = np.meshgrid(np.linspace(-3, 3, 256), np.linspace(-3, 3, 256))
    Z = (1 - X / 2 + X**5 + Y**3) * np.exp(-(X**2) - Y**2)
    levels = np.linspace(Z.min(), Z.max(), 7)

    fig, ax = plt.subplots()
    ax.contourf(X, Y, Z, levels=levels)
    plt.close(fig)
    return fig


def pyplot_simple_example():
    return rx.card(
        pyplot(
            create_contour_plot(),
            alt="Filled contour plot of a two-dimensional function",
            loading="lazy",
            decoding="async",
            width="100%",
            height="400px",
        ),
        bg_color="#ffffff",
        width="100%",
    )

Nach dem Erstellen schließt du jede Grafik unbedingt mit plt.close(fig). Sonst hält der Server die Grafik weiter fest, und der Speicherverbrauch wächst. Die Farben der Grafik bestimmt Matplotlib; damit der weiße Hintergrund auch im dunklen Theme passt, ist sie in rx.card(bg_color="#ffffff") eingepackt.

Liniendiagramm

Die häufigste Grafik. Wie im Skript erstellst du sie mit plt.subplots() und ax.plot() und übergibst die Figure an pyplot.

import matplotlib.pyplot as plt
import numpy as np
import reflex as rx
from reflex_pyplot import pyplot


def create_line_plot():
    x = np.linspace(0, 10, 100)
    fig, ax = plt.subplots()
    ax.plot(x, np.sin(x), label="sin(x)")
    ax.plot(x, np.cos(x), label="cos(x)")
    ax.set_xlabel("x")
    ax.set_ylabel("y")
    ax.legend()
    plt.close(fig)
    return fig


def pyplot_line_example():
    return rx.card(
        pyplot(
            create_line_plot(),
            alt="Sine and cosine curves from zero to ten",
            loading="lazy",
            decoding="async",
            width="100%",
            height="400px",
        ),
        bg_color="#ffffff",
        width="100%",
    )

Balkendiagramm

Bis auf die Übergabe von Kategorien und Werten an ax.bar() funktioniert es genauso.

import matplotlib.pyplot as plt
import reflex as rx
from reflex_pyplot import pyplot


def create_bar_chart():
    fruits = ["apples", "oranges", "bananas", "pears"]
    counts = [23, 17, 35, 29]
    fig, ax = plt.subplots()
    ax.bar(fruits, counts, color="#4e79a7")
    ax.set_ylabel("count")
    ax.set_title("Fruit inventory")
    plt.close(fig)
    return fig


def pyplot_bar_example():
    return rx.card(
        pyplot(
            create_bar_chart(),
            alt="Fruit inventory: apples 23, oranges 17, bananas 35, pears 29",
            loading="lazy",
            decoding="async",
            width="100%",
            height="400px",
        ),
        bg_color="#ffffff",
        width="100%",
    )

Zusammen mit dem State

Ein Streudiagramm mit zufälligen Punkten bekommt einen Button zum Neumischen und einen Schieberegler für die Punktanzahl. Die Grafik erzeugt eine berechnete @rx.var, deshalb wird bei geänderten State-Werten neu gezeichnet. Das Event hat throttle=500, damit höchstens alle 0,5 Sekunden neu gezeichnet wird.

Die Farben einer Matplotlib-Grafik folgen nicht dem App-Theme. Deshalb werden eine helle und eine dunkle Grafik erzeugt, und rx.color_mode_cond zeigt die zum aktuellen Modus passende.

import random

import matplotlib.pyplot as plt
import numpy as np
import reflex as rx
from matplotlib.figure import Figure
from reflex_pyplot import pyplot


def create_plot(theme: str, plot_data: tuple, scale: list):
    bg_color, text_color = ("#1e1e1e", "white") if theme == "dark" else ("white", "black")
    grid_color = "#555555" if theme == "dark" else "#cccccc"

    fig, ax = plt.subplots(facecolor=bg_color)
    ax.set_facecolor(bg_color)

    for (x, y), color in zip(plot_data, ["#4e79a7", "#f28e2b"]):
        ax.scatter(x, y, c=color, s=scale, label=color, alpha=0.6, edgecolors="none")

    ax.legend(loc="upper right", facecolor=bg_color, edgecolor="none", labelcolor=text_color)
    ax.grid(True, color=grid_color)
    ax.tick_params(colors=text_color)
    for spine in ax.spines.values():
        spine.set_edgecolor(text_color)
    for item in [ax.xaxis.label, ax.yaxis.label, ax.title]:
        item.set_color(text_color)
    plt.close(fig)
    return fig


class PyplotState(rx.State):
    num_points: int = 25
    plot_data: tuple = tuple(np.random.rand(2, 25) for _ in range(2))
    scale: list = [random.uniform(0, 100) for _ in range(25)]

    @rx.event(temporal=True, throttle=500)
    def randomize(self):
        self.plot_data = tuple(np.random.rand(2, self.num_points) for _ in range(2))
        self.scale = [random.uniform(0, 100) for _ in range(self.num_points)]

    @rx.event(temporal=True, throttle=500)
    def set_num_points(self, num_points: list[int | float]):
        self.num_points = int(num_points[0])
        yield PyplotState.randomize()

    @rx.var
    def fig_light(self) -> Figure:
        return create_plot("light", self.plot_data, self.scale)

    @rx.var
    def fig_dark(self) -> Figure:
        return create_plot("dark", self.plot_data, self.scale)


def pyplot_example():
    return rx.vstack(
        rx.card(
            rx.color_mode_cond(
                pyplot(PyplotState.fig_light, alt="Scatter plot of the current randomized points", width="100%", height="100%"),
                pyplot(PyplotState.fig_dark, alt="Scatter plot of the current randomized points", width="100%", height="100%"),
            ),
            rx.hstack(
                rx.button("Randomize", on_click=PyplotState.randomize),
                rx.text("Number of Points:"),
                rx.slider(default_value=25, min=10, max=100, on_value_commit=PyplotState.set_num_points),
                width="100%",
            ),
            width="100%",
        ),
        justify_content="center",
        align_items="center",
        width="100%",
    )

Im Beispiel der offiziellen Doku steht beim Schieberegler min_=10, aber bei rx.slider in Reflex 0.10 landet dieser Name als CSS-Stil statt als Mindestwert. Der Code oben ist auf min=10 korrigiert. Außerdem legt dieses Beispiel ein numpy-Array in den State; in einer echten App ist es sicherer, im State einfache Werte wie Listen abzulegen und sie erst beim Erstellen der Grafik in Arrays umzuwandeln.

Häufige Fragen

Wie zeige ich eine Matplotlib-Grafik auf einer Webseite an? Du erstellst die Grafik wie gewohnt und übergibst die Figure an die pyplot-Komponente. Flask, REST-Routen oder base64-Umwandlung sind nicht nötig.

Kann ich Matplotlib-Grafiken interaktiv machen? Ja. Erstelle die Grafik in einer rx.var, die vom State abhängt, und ändere den State über Events wie Buttons oder Schieberegler; dann wird die Grafik automatisch neu gezeichnet (siehe das State-Beispiel oben).

Muss ich plt.show() aufrufen? Nein. plt.show() öffnet ein Desktop-Fenster und wird in Web-Apps nicht verwendet. Gib die Grafik zurück und schließe sie mit plt.close(fig).

API

pyplot zeigt eine einzelne Matplotlib-Grafik an. Eigene Props oder Events gibt es nicht; es nimmt die Standard-Events an, die jede Komponente hat (on_click, on_mount usw.).

ArgumentWerteVerwendung
Erstes Kindmatplotlib.figure.Figure oder ein State-Wert, der eine zurückgibtDie anzuzeigende Grafik
alt · loading · decodingZeichenketteAlternativtext des Bilds, spätes Laden, asynchrones Dekodieren
width · heightCSS-GrößePlatz, den die Grafik einnimmt

Auftrag erledigt

Im State liegt nur der Name des gewählten Produkts, und ein berechneter Wert erzeugt die Balkengrafik für dieses Produkt. Auch dieser Code läuft in einer App, in der reflex-pyplot und matplotlib installiert sind.

import matplotlib.pyplot as plt
import reflex as rx
from matplotlib.figure import Figure
from reflex_pyplot import pyplot

MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
SALES = {"Chairs": [32, 41, 38, 52, 61, 58], "Tables": [12, 15, 21, 19, 24, 30]}


class PyplotReportState(rx.State):
    product: str = "Chairs"

    @rx.event
    def set_product(self, value: str):
        self.product = value

    @rx.var
    def figure(self) -> Figure:
        fig, ax = plt.subplots(figsize=(6, 3))
        ax.bar(MONTHS, SALES[self.product], color="#4e79a7")
        ax.set_title(f"{self.product} sales")
        ax.set_ylabel("units")
        fig.tight_layout()
        plt.close(fig)
        return fig


def pyplot_report():
    return rx.vstack(
        rx.select(["Chairs", "Tables"], value=PyplotReportState.product, on_change=PyplotReportState.set_product),
        rx.card(
            pyplot(PyplotReportState.figure, alt="Monthly sales of the selected product", width="100%"),
            bg_color="#ffffff",
            width="100%",
        ),
        width="100%",
    )

Werkstattnotizen

  • pip install reflex-pyplot (braucht matplotlib). from reflex_pyplot import pyplot.

  • Die Figure als erstes Kind übergeben, etwa pyplot(fig, alt=…, width=…). plt.show() wird nicht verwendet.

  • Nach dem Erstellen die Grafik unbedingt mit plt.close(fig) schließen.

  • Gibt eine berechnete @rx.var eine Figure zurück, wird bei Änderungen am State neu gezeichnet.

  • Die Farben folgen nicht dem Theme, deshalb mit color_mode_cond zwischen heller und dunkler Grafik wechseln.

← Zurück

Andere Diagrammbibliotheken · Plotly

Weiter →

HTML-Elemente · HTML

Über neue Lektionen informiert werden

Wir schicken dir eine E-Mail, wenn dieser Kurs neue Lektionen bekommt oder ein Folgekurs erscheint.

Erhoben: deine E-Mail-Adresse · Zweck: Hinweise auf neue Lektionen oder den Start dieses Kurses · Speicherdauer: bis du die Löschung verlangst. Keine andere Nutzung, keine Weitergabe. Antworte einfach auf eine Benachrichtigung, dann löschen wir sie sofort.

Fragen & Antworten

Frag alles zu dieser Lektion. Fragen aus allen Sprachversionen dieser Seite erscheinen hier gemeinsam.

Wird als reiner Text angezeigt, ohne Links oder Formatierung.

R

ReflexKR

Python und Reflex zum Anfassen. Alle Beispiele wurden mit Reflex 0.10.0 ausgeführt und geprüft.

ReflexKR ist kostenlos und ohne Werbebanner. Wenn es dir geholfen hat, kannst du es mit einem Kaffee unterstützen. ☕ Spendier uns einen Kaffee

Hinweis zu Affiliate-Links
한국어English日本語简体中文EspañolDeutsch

© 2026 ReflexKR · Since 2026 · CC BY-NC 4.0

Built with Reflex