如何以更动态、Pythonic的方式编写点云散点图绘制代码?
Absolutely! Your current code has a ton of repetitive boilerplate that we can eliminate to make it cleaner, more maintainable, and way more dynamic. Here's a streamlined approach that follows Python's DRY (Don't Repeat Yourself) principle:
Step 1: Define a Configuration List
First, we'll create a list of dictionaries that holds all the metadata we need for each point set—this makes it easy to adjust colors, labels, or add/remove camera sets later without rewriting code:
import numpy as np # Assuming pcd, ax, plt are already defined as in your original code # Define your plot configuration in one centralized place plot_configs = [ {"cam_id": "cam_0", "point_type": "positive_point_ids", "color": "blue", "label_suffix": "positive_dot"}, {"cam_id": "cam_1", "point_type": "positive_point_ids", "color": "brown", "label_suffix": "positive_dot"}, {"cam_id": "cam_2", "point_type": "positive_point_ids", "color": "orange", "label_suffix": "positive_dot"}, {"cam_id": "cam_3", "point_type": "positive_point_ids", "color": "azure", "label_suffix": "positive_dot"}, {"cam_id": "cam_0", "point_type": "negative_point_ids", "color": "slateblue", "label_suffix": "negative_dot"}, {"cam_id": "cam_1", "point_type": "negative_point_ids", "color": "firebrick", "label_suffix": "negative_dot"}, {"cam_id": "cam_2", "point_type": "negative_point_ids", "color": "wheat", "label_suffix": "negative_dot"}, {"cam_id": "cam_3", "point_type": "negative_point_ids", "color": "lightcyan", "label_suffix": "negative_dot"}, ]
Step 2: Loop Through the Configuration to Plot
Now we can loop over this config list to handle all point selection and plotting in a single block of code:
for config in plot_configs: # Fetch the relevant point IDs from your cam_points_final dictionary point_ids = cam_points_final[config["cam_id"]][config["point_type"]].tolist() # Extract the target points from the point cloud pts = np.asarray(pcd.select_by_index(point_ids).points) # Generate the plot label dynamically label = f"Cam {config['cam_id'][-1]}_{config['label_suffix']}" # Plot the 3D scatter points ax.scatter(pts[:,0], pts[:,1], pts[:,2], c=config["color"], label=label) plt.show()
Why This Is Better
- Less Repetition: No more copying and pasting variable definitions or scatter calls—all logic lives in one place.
- Easier Maintenance: If you need to change a color, adjust a label, or add a new camera (like
cam_4), you just update theplot_configslist instead of modifying multiple lines of code. - More Readable: The config list clearly lays out what each plot set represents, making it easier for others (or future you) to understand the code at a glance.
If you want to take it a step further, you could split positive and negative configs into separate lists and add shared helper logic, but the above approach strikes a great balance between simplicity and flexibility.
内容的提问来源于stack exchange,提问作者mkr

