slogan3

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

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!