How to get the properties of a picked object in mplot3d (matplotlib + python)?

To get the properties of picked objects in matplotlib 3D, we can use event handling to capture mouse clicks on plot elements and extract their coordinates and other properties.

Understanding Pick Events

A pick event occurs when a user clicks on a pickable artist (like scatter points). The picker parameter defines the tolerance in points for picking.

Creating a 3D Scatter Plot with Pick Events

Here's how to create an interactive 3D scatter plot that displays coordinates when points are clicked ?

import matplotlib.pyplot as plt
import numpy as np

# Set figure size and layout
plt.rcParams["figure.figsize"] = [7.00, 3.50]
plt.rcParams["figure.autolayout"] = True

# Create figure and 3D axis
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# Generate random data for scatter plot
x_data = np.random.rand(10)
y_data = np.random.rand(10)
z_data = np.random.rand(10)
colors = np.random.rand(10)

# Create scatter plot with picker enabled
scatter = ax.scatter(x_data, y_data, z_data, c=colors, 
                    cmap='hot', picker=5, s=100)

# Define pick event handler
def pick_event_handler(event):
    # Get index of picked point
    ind = event.ind[0]
    
    # Get 3D coordinates from the artist
    x, y, z = event.artist._offsets3d
    
    # Display coordinates
    print(f"Point {ind}: x={x[ind]:.3f}, y={y[ind]:.3f}, z={z[ind]:.3f}")

# Connect pick event handler to the figure
fig.canvas.mpl_connect('pick_event', pick_event_handler)

# Set labels and title
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
ax.set_zlabel('Z axis')
ax.set_title('Interactive 3D Scatter Plot')

plt.show()

The output displays an interactive 3D scatter plot. When you click on any point, its coordinates are printed ?

Point 0: x=0.295, y=0.727, z=0.552
Point 3: x=0.739, y=0.881, z=0.207
Point 7: x=0.406, y=0.971, z=0.101
Point 2: x=0.278, y=0.485, z=0.857

Key Components

  • picker parameter: Sets the tolerance for picking in points (5 pixels in this example)

  • event.ind: Contains indices of picked points

  • event.artist._offsets3d: Returns the 3D coordinates of all points

  • mpl_connect(): Connects the event handler to pick events

Enhanced Pick Event Handler

You can extract additional properties from picked objects ?

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='3d')

# Create scatter plot with varied properties
x_data = np.random.rand(8)
y_data = np.random.rand(8)
z_data = np.random.rand(8)
sizes = np.random.randint(50, 200, 8)
colors = np.random.rand(8)

scatter = ax.scatter(x_data, y_data, z_data, c=colors, 
                    s=sizes, cmap='viridis', picker=5, alpha=0.7)

def enhanced_pick_handler(event):
    ind = event.ind[0]
    x, y, z = event.artist._offsets3d
    
    # Get additional properties
    size = event.artist.get_sizes()[ind]
    color_value = colors[ind]
    
    print(f"Point {ind}:")
    print(f"  Coordinates: ({x[ind]:.3f}, {y[ind]:.3f}, {z[ind]:.3f})")
    print(f"  Size: {size}")
    print(f"  Color value: {color_value:.3f}")
    print("-" * 30)

fig.canvas.mpl_connect('pick_event', enhanced_pick_handler)

ax.set_title('Enhanced Pick Event Handler')
plt.show()
Point 2:
  Coordinates: (0.845, 0.234, 0.678)
  Size: 156
  Color value: 0.423
------------------------------
Point 5:
  Coordinates: (0.123, 0.789, 0.345)
  Size: 89
  Color value: 0.712
------------------------------

Conclusion

Pick events in matplotlib 3D allow interactive data exploration by capturing mouse clicks and extracting point properties. Use the picker parameter to enable picking and mpl_connect() to handle events with custom functions.

Updated on: 2026-03-26T14:57:06+05:30

396 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements