Event-Handling Mouse Click mit Matplotplib

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Bright4.55
User
Beiträge: 6
Registriert: Mittwoch 26. November 2025, 10:31

Hallo zusammen,


weiß jemand vielleicht, wie man einen Mausklick auf einer Grafik abfangen kann, wenn Matplotlib benutzt wird?

Ich weiß, wie es mit pygame funktioniert:

import pygame as p

while running:
for e in p.event.get():
if e.type == p.QUIT:
running = False
elif e.type == p.MOUSEBUTTONDOWN:

if not gameOver and humanTurn:
location = p.mouse.get_pos()
col = location[0]//SQ_SIZE
row = location[1]//SQ_SIZE
if sqSelected == (row, col):
sqSelected= ()
playerClicks = []

--> Ich hätte es gerne genauso auch für Matplotlib. Leider funktioniert es bisher nicht wirklich :/.

import matplotlib.pyplot as plt

Es wird dabei ein Brett gezeichnet mit Plot und Scatter. Ich würde nun gerne die Koordinaten abfangen, wenn ein User auf eine Position drauf klickt (auf ein Scatterposition).

Natürlich währen das Spiel läuft (while running = True).

Gerne würde ich auch einen Doppelklick abfangen ( mit den 2 verschiedenen Koordinaten)

Weiß jemand wie das geht?

Vielen Dank im Voraus.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1307
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Hab ich noch nie gemacht, aber das Beispiel funktioniert: https://matplotlib.org/stable/users/exp ... onnections

Code: Alles auswählen

>>> plt.show()
single click: button=1, x=254, y=521, xdata=4.886228, ydata=0.591410
single click: button=1, x=311, y=280, xdata=6.442060, ydata=0.312718
single click: button=1, x=127, y=425, xdata=1.419727, ydata=0.480396
>>>
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Bright4.55
User
Beiträge: 6
Registriert: Mittwoch 26. November 2025, 10:31

Hi,

vielen Dank schon mal.

Ja, das habe ich auch gesehen, allerdings bekomme ich da immer einen Fehler, wenn ich es versuche bei mir einzubauen:


def onclick(event):
print(
( event.button,
event.x, event.y, event.xdata, event.ydata))



def boardgrid(self):

self.fig, self.ax = plt.subplots(figsize=(self.board.width/2.4, self.board.height/2.4))

cid = self.fig.canvas.mpl_connect('button_press_event', self.onclick)

plt.ion()
plt.show()


Da bekomme ich immer den Fehler:

TypeError: BoardVisualizer.onclick() takes 1 positional argument but 2 were given

Was wäre denn da falsch?
Benutzeravatar
__blackjack__
User
Beiträge: 14257
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bright4.55 Ist `onclick()` auf einer Klasse definiert? Dann bekommt das ja auch das Objekt übergeben, hat dafür aber nicht das `self`-Argument.

Edit: Alternativ könnte man eine `staticmethod()` daraus machen, falls das tatsächlich keine echte Methode sein soll/muss.
“Programming is partially an artform and, like artists, programmers will do it even if they don't get money.” — Linus Torvalds
Bright4.55
User
Beiträge: 6
Registriert: Mittwoch 26. November 2025, 10:31

Hi,

ah, okay. Also so würde es jetzt mal zumindest funktionieren:

@staticmethod
def onclick(event):
print(
( event.button,
event.x, event.y, event.xdata, event.ydata))

cid = self.fig.canvas.mpl_connect('button_press_event', self.onclick)

Ausgabe wäre dann:

(<MouseButton.LEFT: 1>, 188, 152, np.float64(3.9722580645161285), np.float64(3.968571428571428))

Was ich nun gerne hätte, dass wenn man einen Punkt (Scatter ) auf meinem Graphen anklickt, dass dann auch diese Koordinate von dem Punkt ausgegeben wird. Also z.B. x = 2 und y = 4.

Es sollten keine Kommazahlen oder so erscheinen :). Der Graph wird per Scatter auch nur mit nichtkommazahlen aufgebaut.

Wäre super, wenn man mir da noch helfen könnte :)
Sirius3
User
Beiträge: 18341
Registriert: Sonntag 21. Oktober 2012, 17:20

Du suchst also `round`.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1307
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Hinweis: round() ist nicht das kaufmännische runden, sondern Wissenschaftliches runden, dass Fehler minimiert.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten