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

如何使用NetworkX在自定义羽毛球场底图上叠加绘制击球序列网络?

错位原因

核心是两个图层的坐标体系不匹配,且networkx绘图时默认会自动调整坐标轴范围,覆盖了羽毛球场的原始坐标区间。

修复方案

  1. 固定羽毛球场的坐标轴范围,避免被后续绘图重置
    在bad_courtV函数末尾追加坐标轴范围固定逻辑,修改后函数如下:
def bad_courtV(ax=None, color='black'):
    # If an axes object isn't provided to plot onto, just get current one
    if ax is None:
        ax = plt.gca()

    ax.plot([0,61],[0,0], color=color)
    ax.plot([61,61], [0,134],color=color)
    ax.plot([61,0], [134,134],color=color)
    ax.plot([0,0], [134,0],color=color)
    ax.plot([0,61],[67,67], color=color, linewidth=4)

    ax.plot([4.6,4.6],[0,134],color=color)
    ax.plot([56.4,56.4],[0,134], color=color)
    ax.plot([61,0],[126.4,126.4], color=color)
    ax.plot([0,61],[7.6,7.6], color=color)

    ax.plot([61,0],[86.8,86.8], color=color)
    ax.plot([0,61],[47.2,47.2], color=color)

    ax.plot([30.5,30.5],[47.2,0], color=color)
    ax.plot([30.5,30.5],[86.8,134], color=color)
    
    # 新增:固定坐标轴范围和球场坐标完全对齐
    ax.set_xlim(0, 61)
    ax.set_ylim(0, 134)
    return ax
  1. 对齐网络节点坐标和球场坐标
    你需要确保pos_bad中所有节点的(x,y)值完全匹配球场的坐标规范:x轴范围061,y轴范围0134。如果pos_bad是其他尺度的坐标(比如归一化的0~1值、像素坐标),需要先做线性映射:
# 示例:将归一化的pos_bad映射到球场坐标范围
pos_bad = {node: (x * 61, y * 134) for node, (x, y) in pos_bad.items()}

# 特殊情况:如果你的原始y轴是从上到下递增(如像素坐标系),用这个映射反转y轴
# pos_bad = {node: (x * 61, 134 - y * 134) for node, (x, y) in pos_bad.items()}
  1. 绘图时关闭坐标轴自动缩放
    修改绘图代码,在绘制网络图前关闭坐标轴自动调整,避免networkx修改已固定的坐标范围:
plt.figure(figsize=(5,10))
ax = bad_courtV()
# 关闭自动缩放,固定坐标范围
ax.autoscale(False)

nx.draw_networkx(
    B, 
    pos_bad,
    with_labels=True,
    width=0.25,
    ax=ax,
    edge_color='gray',
    arrows=True,
    # 可根据需要调整节点大小,避免遮挡球场线条
    node_size=120
)
plt.tight_layout()
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:24:05