先看一个场景。用户问:“球员A最近8场的得分走势怎么样?”系统很快画出一条折线,从第1场的14分一路爬到第8场的22分,曲线优美,斜率漂亮。用户的第一反应是“这人在爆发”。可是如果你把纵轴换成从0开始,再把每场上场时间标出来,故事可能完全不同:前几场他只打了十几分钟,后面才成为首发。折线没有说谎,但它让人得出了一个数据并不支持的结论。半岛体育AI在做可视化时,最先要回答的不是“画什么颜色”,而是“这张图会让用户读出什么”。

先问:用户到底想比较什么

图表选择的起点不是图表库,而是问题里的动词。“走势”“变化”“趋势”指向时间;“谁更多”“排名”指向大小比较;“占比”“构成”指向部分与整体;“谁和谁有关”指向关系。半岛体育把这一步叫作问题意图到视觉任务的映射,大致分成下面几类。

  • 查一个精确数字:“球员A上场均分是多少”,答案是一个数,最好的图表通常是没有图表,直接给一句话加一个小表格。
  • 看随时间的变化:折线或带点的折线,横轴必须是有顺序的时间或场次。
  • 比较几个对象的大小:柱状图或排序后的横向条形图,基线必须从零开始。
  • 看分布与离散程度:箱线图、点阵图,而不是只画一个平均值。
  • 看关系与路径:关系网络图,且仅当节点不多、边有明确含义时才使用。

这一步做完,系统才进入具体选型。顺序不能反:如果先有一个“默认画折线”的习惯,所有问题都会被塞进折线里,误导就是从这里开始的。

五种最常见的误导,以及系统如何拦截

1. 截断的纵轴

示例队甲与示例队乙的场均得分分别是108.2和109.6(示例数据)。如果柱状图的纵轴从107开始,乙的柱子会比甲高出一大截,看上去像是碾压。柱状图用长度编码数值,长度的起点就是零;起点被移走,长度比例就失真。半岛体育AI对柱状图的规则很硬:基线固定为零,除非用户明确要求“放大差异”,此时会改用点图或带误差范围的点线,并在图注写明“纵轴不从零开始”。

2. 样本量太小的折线

“最近3场”的三个点连成的折线,看上去有方向,其实只有三个观察值。三个点几乎可以拼出任何“趋势”。系统会在窗口过短时做两件事:把折线改成逐场的点加数值标签,并在答案里提示“仅3场,波动可能主要来自随机”。样本量不是可以悄悄丢在后台的信息,它应该出现在图旁边。关于窗口本身如何定义,可以参考“最近10场”到底是哪10场。

3. 过度平滑

为了让曲线更好看,很多图表工具默认开启平滑(样条插值)。问题是平滑会在两个真实数据点之间发明出并不存在的起伏,甚至在原本单调上升的数据上画出一个“回落”。体育数据是一场一场离散发生的,第4场和第5场之间没有“第4.5场”。半岛体育AI的默认是折线段直连,并且显示原始数据点;滑动平均只在用户问“整体趋势”时使用,并且必须同时画出原始点,让用户看到平滑前后的差别。

4. 双纵轴

“把球员A的得分和助攻画在一张图里。”得分在0到30之间,助攻在0到10之间,于是有人把两个量各配一个纵轴,让两条线恰好交叉。交叉点没有任何含义,完全取决于两条轴的刻度怎么设。半岛体育AI遇到不同单位的指标,会拆成上下两个小图,共用横轴,各自纵轴独立标注。“两条线交叉”这种视觉事件不该由刻度制造。

5. 把类别当成连续量

把“对阵强队、对阵中游、对阵弱队”三种对手分组用折线连起来,会暗示三者之间存在连续的过渡。类别之间没有中间状态,应该用并列的柱或点,不要用线连接。线本身就是一种声明:这两点之间有连续变化。

一个完整的示例:从问题到图

下面用一个模拟场景走一遍。用户问:“球员A这个赛季的主场和客场得分有区别吗?”

步骤 系统做什么 输出(示例数据)
解析意图比较两个分组,属于“类别间比较”视觉任务:分组比较
取数 按 is_home 分组,统计场次、均值、中位数 主场12场,客场10场
检查样本每组场次小于15,标记为小样本触发提示语
选图点图展示每场得分,叠加组均值线 不用柱状图,保留分布
生成说明写明口径与样本量 “主场均分21.3,客场均分19.8,样本较小,差异不宜过度解读”

对应的取数SQL很朴素,图表选择的信息全部来自这一次查询返回的结构:

SELECT is_home,
       COUNT(*)      AS games,
       AVG(points)   AS avg_points,
       MIN(points)   AS min_points,
       MAX(points)   AS max_points
FROM   player_game_stats
WHERE  player_id = 'P_A001'
  AND  season = '2025-26'
  AND  minutes > 0
GROUP  BY is_home;

注意返回值不只有均值,还有场次、最小值、最大值。系统之所以能判断“该不该用柱状图”“要不要提示小样本”,靠的是这些元数据,而不是靠大模型看一眼数字凭感觉决定。语言模型可以帮忙把选图理由写成一句人话,但选择规则是写死的、可以检查的。这也是半岛体育AI在数据问答流程中把“图表选择”单列成一个步骤的原因。

关系网络图:最容易好看、也最容易没用

知识图谱相关的答案很容易被画成一张节点与连线的网络。问题是,网络图的可读性随节点数增长急剧下降:二十个节点以内,用户可以顺着线读出关系;两百个节点,得到的只是一团毛线。半岛体育AI对关系类答案的做法是:

  • 如果答案是一个明确的路径,例如“球员A效力过球队甲,球队甲的教练后来执教球队乙”,就画成一条从左到右的路径,而不是完整的网络;
  • 如果答案是一个名单,就给表格,附上每个人对应的关系与时间区间;
  • 只有当用户明确想看“某个球员周围有哪些直接关系”,且节点不超过一个阈值时,才画局部网络,并允许折叠。

关系图的价值在于多跳查询本身,而不在于画出来。这一点在知识图谱的相关讨论里有更完整的展开。

颜色、顺序与标注:图里的小细节

除了大类选择,还有几个细节同样会左右读者的判断。

  1. 排序:横向条形图默认按数值降序排列,而不是按字母或球员编号排列;但如果横轴是时间,就必须按时间。
  2. 颜色:同一个球队在全站所有图里保持同一个颜色,避免用户每张图都要重新对照图例;颜色数量控制在少数几种,且不单靠颜色区分,可用直接标注。
  3. 单位与口径:图标题里写明“每场”还是“每36分钟”,“含季后赛”还是“仅常规赛”。同一个“得分”,口径一变,图就换了含义。
  4. 缺失值:球员缺席的场次,横轴上保留空位并标注“缺席”,而不是把前后两点直接连起来。折线穿过缺席,等于告诉用户他一直在打。

同一批数据,三种问法,三种图

还是用虚构的球员A举例,同一张比赛记录表,问题不同,合适的图也不同。

  • “球员A本赛季得分最高的一场是哪场?”——这是一个极值问题,答案是一行记录:日期、对手、得分。系统给一句话加一行表格即可,画一条折线只会让用户在曲线上找最高点。
  • “球员A和球员B谁的场均得分更高?”——两个数的比较,用两根从零开始的柱,并把场次一起标在柱旁。若两人场次差距很大,还要提醒“样本量不同”。
  • “球员A的得分稳定吗?”——这是关于波动的问题,均值几乎回答不了它。合适的是按场次排列的点,加一条均值线和一个标准差带,或者直接用箱线图展示中位数和四分位范围。“稳定”这个词本身也带口径,系统要在图注里说明使用了哪种离散度指标。

三个问题查的是同一张表,差别全在问题的形状。这也解释了为什么图表选择不能放在最后一步“顺手画一下”:它需要知道问题想比较什么,才能决定查询要不要多返回几列,比如场次、标准差、最小值和最大值。

“图表选择”本身也需要被审查

把选图交给规则,并不等于不会错。规则也有覆盖不到的地方:用户的问题可能有两个意图,系统只识别了一个;数据里可能出现极端值,把整个坐标范围撑得很大,使其他点挤在一起。半岛体育AI的设计目标是:对每张图保留“为什么这样选”的记录,包括视觉任务类型、触发的检查项、最终选择的图类型。用户在看图的同时,也可以展开看这些理由,必要时切换成表格。这个思路与答案的证据链是同一件事:图也是答案的一部分,也应该能被追溯。

少画一张图,有时比多画一张更诚实

回到开头的折线。一个更稳妥的回答是:先给一句话,“球员A最近8场场均18.4分(示例数据),其中前3场上场时间明显较短”,然后附一张带上场时间标注的点线图,并写明样本只有8场。这比一条漂亮的上升曲线朴素,也慢一点,但它让用户看到自己需要看的东西。可视化的目标不是让数据更好看,而是让数据不容易被读错。半岛体育AI在选图上宁愿保守:能用表格说清楚的,不硬画图;能用零基线的,不截断;有疑问的地方,写在图的旁边。