ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

用Python绘制赛后数据雷达图:NIP vs WBG系列赛深度解读

用Python绘制赛后数据雷达图:NIP vs WBG系列赛深度解读 先说结论NIP 2-1 WBG 这场系列赛比“谁赢谁输”更有看头的是赛后数据雷达图呈现出来的队伍状态差异。雷达图单看一张很普通放到同一组口径下对比三局才能看出一个队的胜利到底来自对线压制、团战输出、资源控制还是单纯靠某一局状态爆发。这篇文章就围绕“赛后数据雷达图”拆开讲先讲清楚这类图统计哪些维度、为什么不能拿来自嗨再给出一套可以复现的 Python 绘制流程最后用 NIP 对 WBG 这个 2-1 系列赛做读图示范顺便把最常见的误读方式点出来。适合谁看做赛事分析的人、做视频剪辑需要配数据素材的人、写赛后战报的博主以及看比赛时对数据图有疑问的玩家。如果你手头正好有赛后分项数据哪怕不是这场比赛的这套从数据清洗到出图的流程也能直接用。如果只是看个热闹那你至少能学会一件事不要在赛后截图里看到某队“五边形拉满”就急着下结论。1. 赛后数据雷达图到底在表达什么1.1 它是把一场比赛压缩成一张图英雄联盟比赛一局平均半小时期间有对线、换血、推塔、小龙团、大龙团、分带和资源置换。用文字复盘能写几千字用曲线图能看到经济拐点但都不够直观。赛后数据雷达图的作用是把一局比赛的关键统计项压缩到同一个坐标系里让观众一眼看出两支队伍在不同维度上的强项和短板。这张图的本质非常简单从中心向外延伸若干条轴每条轴对应一项数据数值越大图形在那个方向就越突出。多支队伍或多局比赛放在一起时就可以直观比较形状差异。以团队型雷达图为例常见轴包括击杀反映终结比赛的人头交换效率推塔反映地图推进能力经济反映整体资源获取大龙/小龙反映中立资源控制视野反映地图信息获取伤害反映团战和换血输出能力这类图的优点是把多维数据放到同一视野里缺点是很容易让人误以为“面积大的一方一定更强”。这是后文要重点拆的问题。1.2 团队型雷达图和选手型雷达图要分开看赛场上常见两种雷达图。第一种是团队型统计整支队伍合计的数据第二种是选手型围绕单个选手的 KDA、分均经济、分均伤害、伤害占比、参团率、分均插眼等维度展开。团队型雷达图适合回答“这局谁掌控了节奏”选手型雷达图适合回答“这局的胜负手是哪个人”。NIP 2-1 WBG 这种三局两胜的系列赛教练组做复盘时通常两种图都要看先看团队图找宏观差距再看选手图定位具体单线或野区问题。做内容时也一样。如果你只放一张选手雷达图读者很难判断这名选手是“吃了全队资源打出高伤害”还是“在劣势抗压情况下打出了可观的伤害占比”。所以我的习惯是选手图必须搭配团队图或者至少搭配该选手的视野、参团率等过程数据否则信息量不够。1.3 为什么赛后雷达图适合做系列赛比较单局比赛的数据噪声很大。一波大龙毁一生可能让经济差瞬间翻转一次四杀也可能让伤害数据失真。所以单局雷达图只能说明“这一局发生了什么”很难说明“这个队目前强在哪”。系列赛雷达图的价值在于多局累计。NIP 2-1 WBG 打了三局把三局数据按同一口径分别绘制或取均值就能过滤掉一部分偶然因素。比如某一方三局经济轴都很高说明这个队的前期运营能力稳定某一方三局视野轴都偏低说明视野布控是长期短板不是某个人某局发挥失常。从这个角度看赛后雷达图不是“好看的炫技图”而是一个快速定位问题的入口。真正有价值的结论仍然要回到比赛录像和局内事件时间线去验证。2. 画图之前先确定数据口径和维度2.1 不同平台的数据口径不完全一致这是做赛后数据最容易踩的坑。LPL 官方赛后统计、第三方数据站、直播平台插件提供的分项数值很多字段名一样但统计规则可能不同。举几个常见差异伤害数据是只统计对英雄伤害还是把对防御塔、对野怪的伤害也包含进去。视野分数不同平台的视野得分计算加权方式不同有的更偏向排眼有的更偏向持续眼位。参团率以击杀和助攻为分子但如果把推塔助攻也算进去数值会明显不一样。小龙控制是只算击杀小龙次数还是把龙魂类型也折算进权重。所以同一张雷达图里要么全部使用官方数据要么全部使用同一个第三方数据源不能混着取数。跨平台比较数值没有意义因为口径不同。如果你打算在文章或视频里引用 NIP 2-1 WBG 这场系列赛的数据建议统一从一个数据源导出并在图例下面标注“数据来源”。这样既方便读者复核也能避免后续被质疑。2.2 维度不是越多越好雷达图理论上可以放八个、十个轴但超过八个之后图形会变得非常拥挤标签容易重叠读者也来不及看清每一条轴的含义。我更推荐控制在五到八个维度。选择维度有几个原则优先选和胜负相关性强的维度比如经济、击杀、推塔、中立资源。至少放一个过程类维度比如视野不要全是结果类数据。如果要对比系列赛所有局次必须使用完全相同的一组维度。不要同时放“分均伤害”和“总伤害”因为这两个维度信息高度重复只会让图形面积虚增。以团队型为例我常用的一组维度是击杀、推塔、经济、大龙、小龙、视野、团队伤害共七个。选手型则常用KDA、分均经济、分均伤害、伤害占比、参团率、分均视野。这套结构比较稳定适合大多数 LPL 比赛的赛后制图。2.3 原始数据先归一化再画图雷达图的每条轴量纲不同。经济可能是五万击杀只有二十视野分数可能只有一两百。如果不做处理直接画高数值维度会把低数值维度压成一条扁线图就没法看。常用做法是归一化处理。我给一个简单的思路找出该项数据的上限和下限。把原始值映射到 0 到 1 或 0 到 100 区间。上限可以是该赛事的历史极值也可以是本组对比数据中的最大值。如果只是做单场比赛对比最简单的方法是取两支队伍当前维度中的最大值作为 100另一个队按比例折算。这个方法足够直观适合内容创作。但它有一个副作用如果两个队某项数据都特别低图中依然会出现“一方很高”的错觉。所以雷达图上最好同时标注原始数值避免只看形状。3. 用 Python 把赛后数据画成雷达图3.1 环境准备我习惯用 Python 3.9 以上的版本配合三个库完成绘制pandas 做数据读取numpy 做数值计算matplotlib 做最终绘图。想要更漂亮的交互式图表可以改用 pyecharts它的 Radar 组件更适合前端展示。安装命令很简单pip install pandas numpy matplotlib如果要用 pyecharts再补一条pip install pyecharts这里有一个经验matplotlib 默认字体在中文环境下会显示成方框。画中文标签前最好先设置中文字体比如改用 SimHei 或微软雅黑否则图是画出来了但没法用。3.2 准备数据表下面用一组演示数据说明流程。这里的数据只是为了展示代码逻辑不代表 NIP 2-1 WBG 本场真实数值。真实数据请以官方赛后统计为准。import pandas as pd # 演示数据实际请替换为官方赛后分项统计 data { 维度: [击杀, 推塔, 经济, 大龙, 小龙, 视野, 伤害], NIP: [14, 8, 62000, 1, 4, 210, 68000], WBG: [11, 6, 58000, 0, 3, 240, 62000], } df pd.DataFrame(data) print(df)这张表就是最基础的数据结构。每一行对应一个维度每一列对应一支队伍。实际做的时候你会拿到更细的每日赛后统计建议在导入后先检查有没有空值和重复列避免画出来的图出现缺口。3.3 归一化处理把每个维度的最大值映射为 1另一队按比例计算for col in [NIP, WBG]: df[col _norm] df[col] / df[[NIP, WBG]].max(axis1)这一步能得到 0 到 1 之间的归一化值。也可以用 min-max 方法def min_max_norm(series): return (series - series.min()) / (series.max() - series.min()) df[NIP_norm2] min_max_norm(df[NIP]) df[WBG_norm2] min_max_norm(df[WBG])两种方法没有绝对对错。min-max 在单场两队对比时更平滑但会把两队都刷得很高直接取比例更贴近“谁更强”的直觉。我一般会两种都算一遍看图形结果差异再决定用哪种。3.4 绘制雷达图以下是 matplotlib 的核心绘制代码import numpy as np import matplotlib.pyplot as plt from math import pi # 设置中文字体 plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False labels df[维度].tolist() num_vars len(labels) angles np.linspace(0, 2 * pi, num_vars, endpointFalse).tolist() angles angles[:1] fig, ax plt.subplots(figsize(8, 8), subplot_kwdict(polarTrue)) for team, color in [(NIP, #e63946), (WBG, #457b9d)]: values df[team _norm].tolist() values values[:1] ax.plot(angles, values, colorcolor, linewidth2, labelteam) ax.fill(angles, values, colorcolor, alpha0.2) ax.set_xticks(angles[:-1]) ax.set_xticklabels(labels) ax.set_ylim(0, 1.1) ax.legend(locupper right, bbox_to_anchor(1.2, 1.1)) plt.tight_layout() plt.show()这段代码能画出一张基础雷达图。关键是补回第一个点让图形闭合values values[:1]这步不能省否则多边形会缺一条边。3.5 出图之后检查什么很多第一次做雷达图的人跑通代码就急着保存。我建议检查三件事中文标签是否正常显示有没有方框或乱码。每条轴的最高值标注是否清楚避免读者无法还原原始数据。两支队伍的线和填充色是否区分明显色弱用户能不能看懂。另外如果你的图要放到公众号或视频封面里建议在代码里单独输出 PNG 并指定 dpiplt.savefig(nip_wbg_radar.png, dpi200, bbox_inchestight)这样放大之后边缘不会糊投在屏幕上也能看清。4. 从 NIP 2-1 WBG 这场系列赛看读图框架4.1 先看系列赛节奏再看雷达图2-1 的比分说明两队实力非常接近。这种系列赛赢下来的一方往往不是所有维度都领先而是在关键局里把核心维度做到位了。读图的时候我会先把三局比赛按节奏分类前期碾压、中后期翻盘、僵持运营。不同节奏对应的雷达图特征完全不同前期碾压局获胜方的击杀、经济、推塔轴会明显外扩视野轴不一定领先。中后期翻盘局获胜方可能在前期三条轴落后但大龙、小龙、团战伤害轴会突然拉高。僵持运营局双方雷达图面积接近真正拉开差距的往往是视野和大龙控制。以这场系列赛为例如果你拿到三局数据不要把所有局混成一张平均图。先把每一局单独画出来按节奏分类再决定要不要做均值图。直接平均三局容易把“第一局被碾压、第二局翻盘、第三局险胜”的真实过程抹平。4.2 看形状也看各轴的差值雷达图最直接的读法是看形状。一个“五边形战士”式的队伍说明多数维度都领先一个明显凹陷的队伍说明存在清晰的短板。但比形状更重要的是各轴的相对差值。比如 A 队经济只领先 5%击杀却领先 50%说明它赢在经济转化效率上如果经济领先 20% 但伤害轴只领先 8%说明它拿到了资源却没打出应有的输出后续比赛很容易被翻盘。所以我会建议数据分析师在雷达图旁边加一张差值表经济差击杀差推塔差大龙数差视野分差差值比绝对数更能辅助判断胜负原因。雷达图负责让人一眼看到“哪个方向突出”差值表负责回答“突出到什么程度”。4.3 结合具体局数看不要只看最终比分NIP 2-1 WBG 是一个系列赛结果但复盘价值在三局各自的雷达图里。第一局可能是 NIP 通过下路对线滚起雪球第二局可能是 WBG 通过中期团战翻盘第三局可能是 NIP 用视野优势锁死了大龙。如果你只给读者看一张最终汇总雷达图读者根本看不出哪一局谁打得好。更合适的做法是三局雷达图并排展示标注每局胜方。再叠加一张三局均值图看整体趋势。最后用文字说明关键转折点对应的数据变化。这也是为什么代码里要写循环生成图片一局一张图名称带上game1、game2、game3方便后续排版。5. 雷达图最容易误读的几个点5.1 不是面积越大越强这是雷达图最大的陷阱。一个队如果只在小龙、视野、推塔这种“安全数据”上领先而伤害和经济轴只是小幅领先它的图形面积可能很大但实际比赛未必打得有多么碾压。还有一种情况是维度之间的数值相关。比如总伤害和经济高度相关两个维度都放进去等于把同一个信息画了两遍图形面积虚增。这时候面积大完全没有参考意义。正确的读法是逐轴比较先看哪些维度差距超过 10% 或 20%再看哪些维度虽然是优势但没有转化为胜利。最后回到录像确认这局比赛的关键事件是否与图上突出的维度吻合。5.2 单局数据波动很大别急着下结论一局比赛里一次大龙团战就能让经济差从两千变成五千一个抢龙就能让大龙维度从 0 变成 1。这些随机事件会让雷达图的某个轴突然拉高但它不代表这个队的真实实力。所以系列赛复盘时我更看重三局数据的稳定性而不是单局极值。稳定高比一局爆发高更有参考价值。如果你发现某支队伍赢的一局雷达图非常漂亮但输的两局图非常难看说明它的胜利更依赖局内节奏和运气而不是系统性优势。这种队伍在季后赛里往往走不远。5.3 归一化方式会改变图形的视觉结论同样是两队数据用“最大值归一”和用“min-max 归一”画出来的图可能给人完全不同的印象。最大值归一更猛地放大差异min-max 会把两队拉得更近。我在做内容时一般会固定一种方式并在文章里标注。这样前后几期内容才能保持一致的视觉口径。否则你上一期用最大值归一这一期用 min-max两期图对比起来会产生误导。5.4 雷达图反映比赛统计不反映决策质量雷达图只能展示“做了什么”很难展示“为什么做”“做得对不对”。一个队可能在视野轴上很高但关键大龙团前视野恰好空白一个队伤害轴很高但都是刷残血刷出来的团战实际输出效率很低。这些都无法从雷达图上直接判断。所以雷达图是复盘的起点不是终点。认真写战报的人一定会把雷达图和经济曲线、事件时间线放在一起看。6. 落地建议从一张图到一套赛后分析流程6.1 先做单局图再做系列赛汇总图如果你刚接触赛后数据分析我建议流程是确定要分析的是团队还是选手维度。从官方赛后统计或统一数据源导出原始数据。检查缺失字段和明显异常值。确定归一化方式固定下来。先画单局雷达图核对形状和数值是否合理。再画系列赛均值图观察稳定趋势。最后补充差值表和时间线形成完整复盘。不要一上来就写全自动化脚本。手工跑两三次熟悉字段含义和数据质量之后再谈批量化和自动化否则你只会把脏数据更快地变成一堆不可用的图。6.2 给制图脚本固定模板做赛事内容的人都有一个体会每周都要出图每次重新写代码很烦。所以第二次跑通之后我建议把绘图逻辑封装成一个函数。def draw_radar(df, team_a, team_b, title, save_path): # 归一化、绘图、保存 pass输入的df保持统一结构七个维度、两列队伍数据。这样每周只需要替换 CSV 数据就能批量出图标题和输出路径也能自动生成。对做视频的人来说这能节省大量排版时间。6.3 数据来源要合规、时效要标清赛后数据本身是公开信息但使用时建议注明来源。如果你要做程序化的数据采集要注意目标网站对访问频率、商业化使用的限制不要用高并发脚本反复抓取也不要绕过登录或验证机制去拿数据。更稳妥的做法是优先使用官方提供的数据接口或者人工整理赛后的官方统计截图。对普通内容创作者来说手动录入三局、每局七到八个维度成本其实很低完全没必要冒接口采集的风险。6.4 配图时记得给出可读的上下文最后一条经验是雷达图不要单独发。单独一张图读者不知道是对线期数据还是全场比赛数据不知道是单局还是系列赛累计也不知道归一化口径。发布时至少要配上三样信息比赛编号和比分NIP 2-1 WBG数据维度说明数据来源和统计范围把这些写在图下方的小字里内容可信度会高很多。很多人看赛后数据图只看个形状但真正做分析的人应该先把口径说清楚再谈图形解读。NIP 2-1 WBG 这场系列赛最值得记录的并不是最终比分而是三张雷达图背后反映出的两队在节奏、资源和视野上的博弈。把图画对、把口径统一、把结论留在录像验证之后这张赛后数据雷达图才算真正发挥了作用。
返回列表