Ontwikkel interactieve Matplotlib-visualisaties met aangepaste gebeurtenisafhandeling
description
Met deze prompt kunnen gebruikers geavanceerde interactieve plots maken met Matplotlib door aangepaste gebeurtenisafhandeling toe te voegen. Dit verhoogt de gebruikersbetrokkenheid en maakt dynamische reacties op gebruikersacties mogelijk. Het lost het probleem op van statische visualisaties door interactiviteit te bieden zonder complexe externe bibliotheken, waardoor data-exploratie intuïtiever en krachtiger wordt.
prompt
Help me een interactieve Matplotlib-visualisatie te bouwen met mijn dataset: <voer hier een beschrijving van je dataset in>. Ik wil aangepaste gebeurtenisafhandeling toevoegen voor acties zoals muisklikken, hover-events of toetsenbordinvoer ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Hier is een voorbeeld van Python-code die een interactieve Matplotlib-visualisatie opzet met event handlers voor muisklikken en hover-events. Deze code toont annotaties bij aangeklikte punten en past de titel aan op basis van de interactie:
```python
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import datetime
# Voorbeeld dataset: daggegevens van afgelopen maand
dates = pd.date_range(end=pd.Timestamp.today(), periods=30)
np.random.seed(0)
omzet = np.random.randint(100, 500, size=30)
df = pd.DataFrame({'datum': dates, 'omzet': omzet})
# Plot maken
fig, ax = plt.subplots()
ax.plot(df['datum'], df['omzet'], marker='o', linestyle='-')
ax.set_title('Dagelijkse omzet afgelopen maand')
ax.set_xlabel('Datum')
ax.set_ylabel('Omzet (€)')
# Initialiseren van de annotatie (verberg deze eerst)
annot = ax.annotate("", xy=(0,0), xytext=(20,20), textcoords="offset points",
bbox=dict(boxstyle="round", fc="w"),
arrowprops=dict(arrowstyle="->"))
annot.set_visible(False)
def update_annot(ind):
"""Update de annotatie met informatie van het aangeklikte punt."""
x, y = line.get_data()
idx = ind["ind"][0]
annot.xy = (x[idx], y[idx])
text = f"Datum: {pd.to_datetime(x[idx]).date()}\nOmzet: €{y[idx]}"
annot.set_text(text)
annot.get_bbox_patch().set_facecolor('lightyellow')
annot.get_bbox_patch().set_alpha(0.9)
def on_click(event):
"""Handle muisklikken op de plot."""
if event.inaxes == ax:
cont, ind = line.contains(event)
if cont:
update_annot(ind)
annot.set_visible(True)
# Update de titel met datum van geklikt punt
x_data, y_data = line.get_data()
idx = ind["ind"][0]
datum = pd.to_datetime(x_data[idx]).date()
ax.set_title(f"Omzet op {datum}")
fig.canvas.draw_idle()
else:
# Verberg annotatie als buiten punten geklikt wordt
annot.set_visible(False)
ax.set_title('Dagelijkse omzet afgelopen maand')
fig.canvas.draw_idle()
def on_hover(event):
"""Optioneel: hover-effect om een andere feedback te geven."""
vis = annot.get_visible()
if event.inaxes == ax:
cont, ind = line.contains(event)
if cont:
update_annot(ind)
annot.set_visible(True)
fig.canvas.draw_idle()
else:
if vis:
annot.set_visible(False)
ax.set_title('Dagelijkse omzet afgelopen maand')
fig.canvas.draw_idle()
# Plotgegevens extraheren
line, = ax.plot(df['datum'], df['omzet'], marker='o', linestyle='-')
# Event binden
fig.canvas.mpl_connect('button_press_event', on_click)
fig.canvas.mpl_connect('motion_notify_event', on_hover)
plt.show()
```
**Uitleg:**
- We maken een plot van de omzetgegevens.
- Een `annot` object wordt gebruikt om annotaties te tonen bij klikken.
- De functie `update_annot()` vult de annotatie met de juiste data.
- `on_click()` behandelt muisklikken en toont de annotatie, terwijl het de titel bijwerkt naar de datum van het aangeklikte punt.
- `on_hover()` geeft een hover-effect door de annotatie te tonen als de muis over een punt beweegt.
- Event handlers worden gekoppeld aan de plot via `mpl_connect`.
Je kunt deze code verder uitbreiden door bijvoorbeeld toetsenbordinvoer te verwerken of andere visuele feedback toe te voegen!
provider: deepseek
model: deepseek-chat
Hier is een complete Python-implementatie met interactieve event handlers voor uw verkoopgegevens:
```python
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
# Voorbeeld dataset genereren (vervang dit met uw eigen data)
np.random.seed(42)
start_date = datetime.now() - timedelta(days=30)
dates = [start_date + timedelta(days=i) for i in range(31)]
sales = np.random.normal(10000, 2000, 31).astype(int)
df = pd.DataFrame({
'datum': dates,
'omzet': sales
})
# Plot initialiseren
fig, ax = plt.subplots(figsize=(12, 6))
line, = ax.plot(df['datum'], df['omzet'], 'o-', markersize=6, linewidth=2)
ax.set_title('Dagelijkse Verkoopcijfers - Laatste 30 Dagen', fontsize=14, fontweight='bold')
ax.set_xlabel('Datum', fontsize=12)
ax.set_ylabel('Omzet (€)', fontsize=12)
ax.grid(True, alpha=0.3)
fig.autofmt_xdate()
# Huidige annotatie bijhouden
current_annotation = None
# Functie om annotatie te updaten of te verwijderen
def update_annotation(x, y, text):
global current_annotation
if current_annotation:
current_annotation.remove()
current_annotation = ax.annotate(
text,
xy=(x, y),
xytext=(10, 20),
textcoords='offset points',
bbox=dict(boxstyle='round,pad=0.5', fc='yellow', alpha=0.8),
arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0')
)
fig.canvas.draw()
# Mouse click event handler
def on_click(event):
if event.inaxes == ax:
# Zoek het dichtstbijzijnde datapunt
x_data = df['datum']
y_data = df['omzet']
# Converteer datetime naar numerieke waarde voor berekening
x_numeric = [x.timestamp() for x in x_data]
click_x_numeric = event.xdata
# Zoek het dichtstbijzijnde punt
idx = np.argmin(np.abs(np.array(x_numeric) - click_x_numeric))
selected_date = x_data.iloc[idx]
selected_sales = y_data.iloc[idx]
# Update titel en toon annotatie
ax.set_title(f'Geselecteerd: {selected_date.strftime("%d-%m-%Y")} - €{selected_sales:,}',
fontsize=14, fontweight='bold')
annotation_text = f'Datum: {selected_date.strftime("%d-%m-%Y")}\nOmzet: €{selected_sales:,}'
update_annotation(selected_date, selected_sales, annotation_text)
# Hover event handler
def on_hover(event):
if event.inaxes == ax:
x_data = df['datum']
y_data = df['omzet']
x_numeric = [x.timestamp() for x in x_data]
hover_x_numeric = event.xdata
idx = np.argmin(np.abs(np.array(x_numeric) - hover_x_numeric))
# Verander cursor naar pointer bij hover over datapunten
if abs(x_numeric[idx] - hover_x_numeric) < 86400: # ±1 dag
fig.canvas.set_cursor(plt.Cursors.HAND)
else:
fig.canvas.set_cursor(plt.Cursors.ARROW)
# Keyboard event handler
def on_key(event):
global current_annotation
if event.key == 'escape':
# Reset naar originele staat
if current_annotation:
current_annotation.remove()
current_annotation = None
ax.set_title('Dagelijkse Verkoopcijfers - Laatste 30 Dagen',
fontsize=14, fontweight='bold')
fig.canvas.draw()
elif event.key == 'r':
# Toon willekeurig datapunt
random_idx = np.random.randint(0, len(df))
random_date = df['datum'].iloc[random_idx]
random_sales = df['omzet'].iloc[random_idx]
ax.set_title(f'Willekeurige selectie: {random_date.strftime("%d-%m-%Y")} - €{random_sales:,}',
fontsize=14, fontweight='bold')
annotation_text = f'Willekeurig gekozen:\n{random_date.strftime("%d-%m-%Y")}\nOmzet: €{random_sales:,}'
update_annotation(random_date, random_sales, annotation_text)
# Event handlers koppelen
fig.canvas.mpl_connect('button_press_event', on_click)
fig.canvas.mpl_connect('motion_notify_event', on_hover)
fig.canvas.mpl_connect('key_press_event', on_key)
plt.tight_layout()
plt.show()
```
**Gebruiksinstructies:**
- **Klik** op een datapunt om details te zien
- **Hover** over de grafiek voor interactieve cursor
- **Druk op 'r'** voor een willekeurige selectie
- **Druk op 'escape'** om te resetten
**Aanpasbare opties:**
```python
# Voor aangepaste kleuren en stijlen:
colors = {'annotation_bg': 'lightblue', 'line_color': 'red'}
styles = {'font_size': 10, 'marker_size': 8}
# Voor extra keyboard shortcuts:
def extended_key_handler(event):
if event.key == 'a':
# Voeg uw custom actie toe
pass
# Voeg meer keys toe naar wens
```
**Vervang de dataset** door uw eigen gegevens:
```python
# Laad uw eigen dataset
df = pd.read_csv('uw_bestand.csv')
df['datum'] = pd.to_datetime(df['datum'])
```
Deze code biedt een solide basis voor interactieve data-exploratie met volledig aanpasbare event handling!