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

