How can I pass parameters to on_key in fig.canvas.mpl_connect('key_press_event',on_key)?

When working with matplotlib event handling, you sometimes need to pass additional parameters to your callback function. The fig.canvas.mpl_connect('key_press_event', on_key) method only accepts the event handler function, but there are several ways to pass extra parameters.

Method 1: Using Lambda Functions

The most straightforward approach is to use a lambda function to wrap your callback ?

import matplotlib.pyplot as plt

plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

fig, ax = plt.subplots()
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)

# Parameters to pass
marker_style = 'ro-'
marker_size = 8

def onkey(event, marker, size):
    if event.key.isalpha():
        if event.xdata is not None and event.ydata is not None:
            ax.plot(event.xdata, event.ydata, marker, markersize=size)
            fig.canvas.draw()

# Use lambda to pass parameters
cid = fig.canvas.mpl_connect('key_press_event', 
                            lambda event: onkey(event, marker_style, marker_size))
plt.show()

Method 2: Using functools.partial

The functools.partial function creates a partial function with pre-filled arguments ?

import matplotlib.pyplot as plt
from functools import partial

plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

fig, ax = plt.subplots()
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)

def onkey(event, marker='bo-', size=6, color='blue'):
    if event.key.isalpha():
        if event.xdata is not None and event.ydata is not None:
            ax.plot(event.xdata, event.ydata, marker, 
                   markersize=size, color=color)
            fig.canvas.draw()

# Create partial function with parameters
callback = partial(onkey, marker='gs-', size=10, color='green')
cid = fig.canvas.mpl_connect('key_press_event', callback)
plt.show()

Method 3: Using Class-Based Approach

For more complex scenarios, create a class to encapsulate the callback and its parameters ?

import matplotlib.pyplot as plt

class KeyHandler:
    def __init__(self, ax, fig, marker='bo-', size=8):
        self.ax = ax
        self.fig = fig
        self.marker = marker
        self.size = size
        self.points = []
    
    def on_key(self, event):
        if event.key.isalpha():
            if event.xdata is not None and event.ydata is not None:
                self.points.append((event.xdata, event.ydata))
                self.ax.plot(event.xdata, event.ydata, self.marker, 
                           markersize=self.size)
                self.fig.canvas.draw()
                print(f"Added point: ({event.xdata:.2f}, {event.ydata:.2f})")

plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

fig, ax = plt.subplots()
ax.set_xlim(0, 10)
ax.set_ylim(0, 10)

# Create handler instance with parameters
handler = KeyHandler(ax, fig, marker='r^-', size=12)
cid = fig.canvas.mpl_connect('key_press_event', handler.on_key)
plt.show()

Comparison

Method Best For Advantages Disadvantages
Lambda Simple cases Concise, readable Limited to simple expressions
functools.partial Multiple parameters Clean, flexible Requires import
Class-based Complex logic Stateful, organized More verbose

Conclusion

Use lambda functions for simple parameter passing, functools.partial for multiple parameters, and class-based approaches for complex event handling with state management. Choose the method that best fits your specific use case.

---
Updated on: 2026-03-25T21:39:56+05:30

707 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements