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
相关产品推荐
相关产品推荐

