21. 2D/3D Visualisierung & interaktive Plots#
21.1. Plot 2D/3D Data#
Werte auf einem 2D Gitter (z.B. Höhen, Bilder…) können z.B. mit .imshow() dargestellt werden:
import numpy as np
from matplotlib import pyplot as plt
arr = np.random.random((20, 20)) * np.linspace(-1, 1, 20)
fig, ax = plt.subplots(figsize=(6, 6))
ax.imshow(arr)
plt.show()
21.2. .contour()#
Wenn es weniger um einzele „Pixel“ oder Kästchen geht, sondern um Areale und Grenzen oder Übergänge, eignet sich oft auch ein Kontour-Plot:
fig, ax = plt.subplots(figsize=(6, 6))
ax.contour(arr)
plt.show()
Hier ein weiteres Beispiel für diese beiden Plot-Typen mit 3D Daten die wir mit imshow() oder contour() in 2D darstellen können:
n = 500
x, y = np.meshgrid(np.linspace(-3, 3, n),
np.linspace(-3, 3, n))
z = (1 - x/2 + x**5 + y**3) * np.exp(-x**2 - y**2)
print(f"'z' hat die Form: {z.shape}")
'z' hat die Form: (500, 500)
z
array([[-4.07401958e-06, -4.29919749e-06, -4.53533585e-06, ...,
3.62098001e-06, 3.44811482e-06, 3.28206063e-06],
[-4.37287339e-06, -4.61446687e-06, -4.86781133e-06, ...,
3.89741457e-06, 3.71122130e-06, 3.53237524e-06],
[-4.69233163e-06, -4.95146515e-06, -5.22319372e-06, ...,
4.19367707e-06, 3.99319078e-06, 3.80062746e-06],
...,
[-3.76545993e-06, -3.95539782e-06, -4.15307442e-06, ...,
5.26379637e-06, 4.98925812e-06, 4.72749916e-06],
[-3.49964129e-06, -3.67604360e-06, -3.85962160e-06, ...,
4.90560429e-06, 4.64964457e-06, 4.40560734e-06],
[-3.25160068e-06, -3.41538087e-06, -3.58581248e-06, ...,
4.57050338e-06, 4.33193144e-06, 4.10447954e-06]],
shape=(500, 500))
fig, ax = plt.subplots(figsize=(6, 6))
ax.imshow(z)
<matplotlib.image.AxesImage at 0x7fc00813d880>
21.3. .contour()#
fig, ax = plt.subplots(figsize=(7, 7))
cs = ax.contour(z)
ax.clabel(cs, inline=True, fontsize=10)
plt.show()
21.4. 3D geht auch (ein wenig…)#
Es gibt einige Möglichkeiten auch 3D Visualisierungen mit Matplotlib zu erstellen. Allerdings ist das ziemlich limitiert. Zum einen gibt es andere Tools und Bibliotheken die deutlich besser 3D Daten darstellen können, also schneller, schöner und mit weniger Aufwand beim Coden. Zum anderen eignen sich die meisten 3D Darstellungen eher für interaktive Umsetzungen und das geht eben auch mit anderen Tools deutlich besser, in Python z.B. mit Plotly, Vispy, und vielen anderen.
fig, ax = plt.subplots(subplot_kw={"projection": "3d"},
figsize=(8, 8), dpi=150)
surf = ax.plot_surface(x, y, z, cmap="viridis",
linewidth=0, antialiased=True)
ax.view_init(20, -50) # Blickwinkel festlegen
ax._axis3don = False # 3d Achsen nicht anzeigen
plt.show()
Spätestens hier, bei 3D Visualisierungen kommmen wir in der Praxis aber fast nicht mehr um Interaktivität herum.
21.5. Dynamisch vs. statisch#
Visualisierungen in Python lassen sich in zwei Hauptkategorien unterteilen:
Statische Visualisierungen: Diese werden mit Bibliotheken wie Matplotlib, Pandas oder Seaborn erstellt. Sie eignen sich hervorragend für Präsentationen und Berichte, da sie keine interaktiven Elemente enthalten.
Dynamische Visualisierungen: Bibliotheken wie Plotly, Bokeh oder Altair ermöglichen die Erstellung interaktiver Plots, bei denen Benutzer beispielsweise zoomen, Details anzeigen oder die Darstellung in Echtzeit aktualisieren können. Diese eignen sich besonders für Dashboards und webbasierte Anwendungen.
import plotly.express as px
data = px.data.iris()
data.head()
| sepal_length | sepal_width | petal_length | petal_width | species | species_id | |
|---|---|---|---|---|---|---|
| 0 | 5.1 | 3.5 | 1.4 | 0.2 | setosa | 1 |
| 1 | 4.9 | 3.0 | 1.4 | 0.2 | setosa | 1 |
| 2 | 4.7 | 3.2 | 1.3 | 0.2 | setosa | 1 |
| 3 | 4.6 | 3.1 | 1.5 | 0.2 | setosa | 1 |
| 4 | 5.0 | 3.6 | 1.4 | 0.2 | setosa | 1 |
21.6. Interaktive Visualisierungen mit Bokeh#
Bokeh ist eine leistungsstarke Bibliothek, die es uns ermöglicht, interaktive Plots zu erstellen. Damit lassen sich Visualisierungen realisieren, die direkt im Webbrowser ausgeführt werden und Funktionen wie Zoomen, Schwenken und Anzeigen von Details unterstützen.
21.6.1. Beispiel: Scatterplot mit interaktiven Features#
from bokeh.plotting import figure, show
from bokeh.io import output_notebook
output_notebook()
colormap = {'setosa': 'red', 'versicolor': 'green', 'virginica': 'blue'}
colors = [colormap[x] for x in data['species']]
p = figure(title="Interaktiver Scatterplot (Iris Dataset)",
x_axis_label="sepal_width",
y_axis_label="sepal_length",
tools="pan, box_zoom, reset, save")
# Punkte hinzufügen
p.scatter(data["sepal_width"], data["sepal_length"], fill_color=colors,
size=10, fill_alpha=0.5)
# Plot anzeigen
show(p)
21.7. Interaktive Visualisierungen mit Altair#
Altair basiert auf der „Grammar of Graphics“ und eignet sich hervorragend für schnelle und interaktive Visualisierungen. Es bietet eine intuitive Syntax und ist besonders bei statistischen Visualisierungen beliebt.
21.7.1. Beispiel: Scatterplot mit Tooltips#
import altair as alt
# Scatterplot erstellen
chart = alt.Chart(data).mark_circle(size=60).encode(
x="sepal_width",
y="sepal_length",
color="species",
size='sepal_length',
tooltip=["sepal_width", "sepal_length", 'species']
).interactive()
chart
21.8. Interaktive Visualisierungen mit Plotly Express#
Plotly ist eine vielseitige Bibliothek, die interaktive Visualisierungen unterstützt. Sie eignet sich besonders für Dashboards und 3D-Visualisierungen. Eine noch einfacher zu verwendende Schnittstelle von Plotly ist Plotly Express.
21.8.1. Beispiel: 2D Scatterplot#
import plotly.io as pio
import plotly.express as px
import plotly.offline as py
fig = px.scatter(
data,
x="sepal_width", y="sepal_length", color="species", size="sepal_length",
width=800, height=800
)
fig
21.8.2. Beispiel: 3D Scatterplot#
fig = px.scatter_3d(
data,
x="sepal_width", y="sepal_length", z='petal_width',
color="petal_length",
symbol='species',
width=800, height=800
)
fig.show()
Plotly Express stellt einige sehr wichtige Standard-Plots zur Verfügung. Für Visualisierungen die darüber hinaus gehen, oder weitere spezielle Anpassungen benötigen ist es aber manchmal nötig direkt auf Ploty zurückzugreifen. Zum Beispiel auch um Flächen in 3D zu rendern.
import plotly.graph_objects as go
# Read data from a csv
z_data = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/api_docs/mt_bruno_elevation.csv')
# Create the figure
fig = go.Figure(data=[go.Surface(z=z_data.values, colorscale='Viridis', showscale=False)])
# Update layout
fig.update_layout(
title='Mt Bruno Elevation',
autosize=False,
width=800,
height=800,
margin=dict(l=65, r=50, b=65, t=90)
)
fig.show()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[14], line 4
1 import plotly.graph_objects as go
3 # Read data from a csv
----> 4 z_data = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/api_docs/mt_bruno_elevation.csv')
6 # Create the figure
7 fig = go.Figure(data=[go.Surface(z=z_data.values, colorscale='Viridis', showscale=False)])
NameError: name 'pd' is not defined