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

Python使用mplsoccer绘制足球场网格赋值及传球起止值差计算问题

解决方案

第一部分:网格方块赋值实现

你可以通过定义二维数组存储每个网格的自定义数值,还可以选择在网格中心展示对应数值,完整实现代码如下:

!pip install mplsoccer
from mplsoccer import Pitch
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 定义网格线坐标
x_grid = np.arange(0,105, 6.5625) # 共16条竖线,划分为15列网格
y_grid = np.arange(0,68,6.18) # 共11条横线,划分为10行网格

# 初始化网格值二维数组,维度为 [行数量, 列数量] = [len(y_grid)-1, len(x_grid)-1]
# 你可以手动修改任意位置的数值为你需要的赋值
grid_values = np.zeros((len(y_grid)-1, len(x_grid)-1))
# 示例手动赋值,可按需修改所有网格值
grid_values[1][6] = 0.006
grid_values[2][10] = 0.027
grid_values[9][7] = 0.006
grid_values[6][12] = 0.014

# 绘制球场
pitch = Pitch(pitch_type='uefa', line_zorder=1,
              pitch_color='#22312b', line_color='#efefef')
fig, ax = pitch.draw(figsize=(6.6, 4.125))
fig.set_facecolor('#22312b')

# 绘制网格虚线
plt.vlines(x_grid,0,67.9,zorder = 1, linestyles="--")
plt.hlines(y_grid, 0, 104.9, zorder = 1,linestyles="--")

# 可选:在每个网格中心显示对应数值,可调整字体大小、颜色适配你的样式
for i in range(len(y_grid)-1):
    for j in range(len(x_grid)-1):
        center_x = (x_grid[j] + x_grid[j+1])/2
        center_y = (y_grid[i] + y_grid[i+1])/2
        ax.text(center_x, center_y, f"{grid_values[i][j]:.3f}", 
                color='white', fontsize=7, ha='center', va='center')

第二部分:传球网格值匹配与结构化结果输出

通过np.digitize定位坐标所属的网格索引,即可提取对应网格值,最终生成你需要的结构化表格,实现代码如下:

# 定义坐标转对应网格值的工具函数
def get_grid_value(point_x, point_y, x_grid, y_grid, grid_values):
    # 计算坐标所在的网格索引
    x_idx = np.digitize(point_x, x_grid) - 1
    y_idx = np.digitize(point_y, y_grid) - 1
    # 边界溢出处理,避免索引越界
    x_idx = np.clip(x_idx, 0, len(x_grid)-2)
    y_idx = np.clip(y_idx, 0, len(y_grid)-2)
    return grid_values[y_idx][x_idx]

# 你的传球数据
d={'X': [45, 52], 'Y': [12, 67],'end_X':[70,82], 'end_Y':[20,44]}
df = pd.DataFrame(d)

# 批量计算起点、终点网格值和差值
df['Start'] = df.apply(lambda row: get_grid_value(row['X'], row['Y'], x_grid, y_grid, grid_values), axis=1)
df['End'] = df.apply(lambda row: get_grid_value(row['end_X'], row['end_Y'], x_grid, y_grid, grid_values), axis=1)
# 如需差值取绝对值可以改为 abs(df['End'] - df['Start'])
df['difference'] = df['End'] - df['Start']

# 输出结构化结果
print(df)

运行上述代码后输出的df就是你要求格式的结果表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:33:00