如何统计Python matplotlib网格中包含x,y坐标点的网格数量及占比
实现方案
核心逻辑
你提到的示例总网格数48对应x轴[-960,960]划分为8段、y轴[-540,540]划分为6段的配置,我们先显式定义网格划分参数,避免matplotlib自动调整刻度导致的网格计数偏差,再通过坐标映射找到散点所属的网格,最后填充并统计即可。
完整可运行代码
import numpy as np import matplotlib.pyplot as plt from matplotlib.patches import Rectangle # -------------------------- 配置参数 -------------------------- # 坐标范围 X_MIN, X_MAX = -960, 960 Y_MIN, Y_MAX = -540, 540 # 网格划分数量(对应示例48总网格:8*6=48,可按需修改) X_GRID_NUM = 8 Y_GRID_NUM = 6 # 计算每个网格的宽高 grid_width = (X_MAX - X_MIN) / X_GRID_NUM grid_height = (Y_MAX - Y_MIN) / Y_GRID_NUM # 散点数量 POINT_NUM = 15 # 底图路径,替换为你自己的本地路径 scene_folder = "your_image_path.png" # -------------------------- 生成随机点+识别含点网格 -------------------------- # 固定随机种子可复现结果,不需要可以删除下一行 np.random.seed(42) x = np.random.randint(X_MIN, X_MAX, POINT_NUM) y = np.random.randint(Y_MIN, Y_MAX, POINT_NUM) # 计算每个点所属的网格索引,去重得到所有含点的网格 grid_set = set() for px, py in zip(x, y): # 计算x方向网格索引(从左到右0到X_GRID_NUM-1) x_idx = int((px - X_MIN) // grid_width) # 边界处理:刚好落在X_MAX的点归到最后一个网格 x_idx = min(x_idx, X_GRID_NUM - 1) # 计算y方向网格索引(从下到上0到Y_GRID_NUM-1) y_idx = int((py - Y_MIN) // grid_height) y_idx = min(y_idx, Y_GRID_NUM - 1) grid_set.add((x_idx, y_idx)) # -------------------------- 绘图 -------------------------- fig, ax = plt.subplots(figsize=(20, 11)) # 先画底图 img = plt.imread(scene_folder) ax.imshow(img, extent = [X_MIN, X_MAX, Y_MIN, Y_MAX], aspect='auto') # 填充所有含点的网格为白色,透明度可按需调整 for (x_idx, y_idx) in grid_set: # 计算网格左下角坐标 grid_x0 = X_MIN + x_idx * grid_width grid_y0 = Y_MIN + y_idx * grid_height # 添加白色矩形 ax.add_patch(Rectangle((grid_x0, grid_y0), grid_width, grid_height, color='white', alpha=0.7)) # 画网格、散点 ax.grid(color='white', linestyle='--', linewidth=1) # zorder参数保证散点在最上层,不会被白色填充盖住 ax.scatter(x, y, marker='o', color='red', alpha=0.8, zorder=10) # 显式设置刻度,保证网格和我们定义的划分完全一致 ax.set_xticks(np.arange(X_MIN, X_MAX+1, grid_width)) ax.set_yticks(np.arange(Y_MIN, Y_MAX+1, grid_height)) plt.show() plt.close() # -------------------------- 统计计算 -------------------------- total_grid = X_GRID_NUM * Y_GRID_NUM has_point_grid = len(grid_set) ratio = has_point_grid / total_grid * 100 print(f"总网格数:{total_grid}") print(f"含散点的网格数:{has_point_grid}") print(f"占比:{ratio:.1f}%")
补充说明
- 如果需要调整网格划分数量,直接修改
X_GRID_NUM和Y_GRID_NUM即可,代码会自动适配 - 白色填充的透明度可以修改
Rectangle的alpha参数调整,0为完全透明,1为完全不透明
内容的提问来源于stack exchange,提问作者Phoenix
相关产品推荐
相关产品推荐

