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
reflex_pyplot.pyplotOffizielle 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).
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.
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.
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.
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-pyplotDu 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.
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%",
)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%",
)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.
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).
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.).
| Argument | Werte | Verwendung |
|---|---|---|
| Erstes Kind | matplotlib.figure.Figure oder ein State-Wert, der eine zurückgibt | Die anzuzeigende Grafik |
alt · loading · decoding | Zeichenkette | Alternativtext des Bilds, spätes Laden, asynchrones Dekodieren |
width · height | CSS-Größe | Platz, den die Grafik einnimmt |
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.
Über neue Lektionen informiert werden
Wir schicken dir eine E-Mail, wenn dieser Kurs neue Lektionen bekommt oder ein Folgekurs erscheint.
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© 2026 ReflexKR · Since 2026 · CC BY-NC 4.0
Fragen & Antworten
Frag alles zu dieser Lektion. Fragen aus allen Sprachversionen dieser Seite erscheinen hier gemeinsam.