You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python matplotlib如何在网格单元格中绘制指定方向的箭头

问题描述

我有如下数值矩阵:
矩阵示例

需求如下:

  • 为网格中每个单元格找到值最大的相邻单元格,仅考虑上、下、左、右4个方向的邻接单元格
  • 在每个单元格内绘制箭头,箭头指向该单元格值最大的邻域
    最终期望的输出效果如下:
    箭头网格效果示例

目前已完成邻域方向计算的代码片段:

import numpy as np
import matplotlib.pyplot as plt

matrix = [[22, 24.4, 22, 19.4, 17.5],
          [19.8, 22, 19.8, 17.8, 16],
          [17.8, 19.8, 17.8, 16, 14.4],
          [16, 17.8, 16, 14.4, 13],
          [14.4, 16, 14.4, 13, 11.7]]

#.... 中间处理逻辑
# L/R/D/U 分别对应左、右、下、上四个方向
arrows = [['R', 'D', 'L', 'L', 'L'],
          ['U', 'U', 'L', 'L', 'L'],
          ['U', 'U', 'L', 'L', 'L'],
          ['U', 'U', 'L', 'L', 'L'],
          ['U', 'U', 'L', 'L', 'L']]
# 待实现:箭头绘制逻辑

待解决问题:在网格对应位置绘制匹配方向的箭头,例如arrows[i][j] == 'R'时,在网格[i][j]位置绘制指向右侧的箭头,其余三个方向逻辑同理。

实现代码

直接用matplotlib自带的箭头标注接口即可完成绘制,无需额外依赖第三方库,完整可运行代码如下:

import numpy as np
import matplotlib.pyplot as plt

matrix = np.array([[22, 24.4, 22, 19.4, 17.5],
                   [19.8, 22, 19.8, 17.8, 16],
                   [17.8, 19.8, 17.8, 16, 14.4],
                   [16, 17.8, 16, 14.4, 13],
                   [14.4, 16, 14.4, 13, 11.7]])
arrows = [['R', 'D', 'L', 'L', 'L'],
          ['U', 'U', 'L', 'L', 'L'],
          ['U', 'U', 'L', 'L', 'L'],
          ['U', 'U', 'L', 'L', 'L'],
          ['U', 'U', 'L', 'L', 'L']]

# 方向与坐标偏移映射,注意imshow坐标系原点在左上角,纵向向下坐标递增
offset_map = {
    'R': (0.3, 0),
    'L': (-0.3, 0),
    'D': (0, 0.3),
    'U': (0, -0.3)
}

fig, ax = plt.subplots(figsize=(6,6))
# 绘制彩色网格底图
ax.imshow(matrix, cmap='viridis', alpha=0.8)

rows, cols = matrix.shape
for i in range(rows):
    for j in range(cols):
        # 标注单元格数值
        ax.text(j, i, matrix[i, j], ha='center', va='center', color='white')
        # 绘制方向箭头
        dx, dy = offset_map[arrows[i][j]]
        ax.annotate(
            '',
            xy=(j + dx, i + dy),
            xytext=(j, i),
            arrowprops=dict(arrowstyle="->", color='black', linewidth=2)
        )

# 隐藏坐标轴刻度
ax.set_xticks([])
ax.set_yticks([])
plt.tight_layout()
plt.show()

关键逻辑说明:

  • imshow绘制的网格坐标系原点在左上角,行号i从上到下递增,列号j从左到右递增,因此方向偏移量需要和这个坐标系匹配
  • 箭头长度通过偏移量的数值(这里取0.3)控制,保证箭头不会超出单元格范围
  • 箭头通过annotate接口实现,起点固定在单元格中心,终点根据方向偏移即可

内容的提问来源于stack exchange,提问作者nima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 05:42:15