用Python+Matplotlib分析你的游戏战绩:手把手教你画多组数据对比箱线图

张开发
2026/4/18 16:18:07 15 分钟阅读

分享文章

用Python+Matplotlib分析你的游戏战绩:手把手教你画多组数据对比箱线图
用PythonMatplotlib分析你的游戏战绩手把手教你画多组数据对比箱线图每次游戏结束后看着战绩面板上密密麻麻的数字你是否好奇自己最擅长的英雄究竟是哪个或者想知道在不同时间段的表现稳定性如何箱线图Boxplot正是解决这类问题的利器。它能直观展示数据的分布、离散程度和异常值特别适合对比多组游戏数据。本文将带你用Python的Matplotlib库从游戏CSV文件中提取数据绘制专业级的多组对比箱线图让你一眼看穿自己的游戏表现。1. 准备工作数据获取与环境配置在开始分析前我们需要准备好游戏数据和Python环境。大多数游戏平台都支持导出对战记录为CSV格式通常包含英雄名称、KDA击杀/死亡/助攻、游戏时长等信息。假设我们已经获得了一个名为game_stats.csv的文件结构如下hero,kills,deaths,assists,game_duration Ashe,8,3,12,28 Zed,12,5,4,32 ...接下来配置Python环境。推荐使用Anaconda创建虚拟环境安装必要的库conda create -n game_analysis python3.9 conda activate game_analysis pip install pandas matplotlib numpy2. 数据清洗与预处理原始游戏数据往往需要清洗才能用于分析。我们使用pandas读取CSV并计算KDA比率(击杀助攻)/死亡import pandas as pd # 读取数据 df pd.read_csv(game_stats.csv) # 计算KDA并处理除零错误死亡为0时 df[kda] (df[kills] df[assists]) / df[deaths].replace(0, 1) # 按英雄分组 hero_stats df.groupby(hero)[kda].apply(list).to_dict()常见的数据问题及处理方法问题类型处理方法代码示例缺失值删除或填充df.dropna()极端值Winsorize处理from scipy.stats.mstats import winsorize数据格式类型转换df[column] pd.to_numeric(df[column])提示游戏时长较短的局如10分钟可能数据不具代表性建议过滤df df[df[game_duration] 10]3. 基础箱线图绘制Matplotlib的boxplot()函数是绘制箱线图的核心工具。我们先从最简单的单组数据开始import matplotlib.pyplot as plt import numpy as np # 设置中文显示 plt.rcParams[font.family] SimHei plt.rcParams[axes.unicode_minus] False # 提取前3个英雄的数据 sample_data [hero_stats[k] for k in list(hero_stats.keys())[:3]] labels list(hero_stats.keys())[:3] # 基础箱线图 plt.figure(figsize(10, 6)) plt.boxplot(sample_data, labelslabels) plt.title(英雄KDA对比) plt.ylabel(KDA比率) plt.grid(axisy, linestyle--, alpha0.7) plt.show()箱线图各组成部分含义箱体显示数据的四分位范围Q1到Q3中位线箱体内的横线表示数据的中位数须线通常延伸到1.5倍IQR四分位距范围内的数据异常值超出须线范围的点可能表现特别出色或糟糕的对局4. 高级定制技巧4.1 多组数据对比要对比不同时间段的表现我们可以按日期分组# 假设数据有date列 df[date] pd.to_datetime(df[date]) df[weekday] df[date].dt.day_name() # 按星期几分组 weekday_stats df.groupby(weekday)[kda].apply(list) # 绘制对比图 plt.figure(figsize(12, 7)) box plt.boxplot(weekday_stats.values, labelsweekday_stats.index, patch_artistTrue, medianprops{color: black}) # 自定义颜色 colors [#FF9999, #66B2FF, #99FF99, #FFCC99, #FFD700] for patch, color in zip(box[boxes], colors): patch.set_facecolor(color) plt.title(不同星期几的KDA表现对比) plt.show()4.2 交互式可视化使用mplcursors库添加悬停提示import mplcursors fig, ax plt.subplots(figsize(12, 7)) boxes ax.boxplot(hero_stats.values(), labelshero_stats.keys(), vertFalse, showfliersFalse) cursor mplcursors.cursor(boxes[boxes], hoverTrue) cursor.connect(add) def on_add(sel): hero list(hero_stats.keys())[sel.index] stats hero_stats[hero] sel.annotation.set_text( f{hero}\n f场次: {len(stats)}\n f中位数: {np.median(stats):.2f}\n f最佳: {np.max(stats):.2f} ) plt.show()4.3 参数深度解析boxplot()的关键参数实际应用plt.figure(figsize(14, 8)) plt.boxplot( hero_stats.values(), labelshero_stats.keys(), notchTrue, # 显示中位数置信区间 bootstrap5000, # 提高置信区间精度 whis(5, 95), # 显示5%-95%范围 showmeansTrue, # 显示均值 meanlineTrue, # 均值显示为线而非点 patch_artistTrue, boxpropsdict(facecolorlightblue, alpha0.7), flierpropsdict(markero, markersize8, markerfacecolorred) ) plt.xticks(rotation45) plt.tight_layout()5. 实战分析你的游戏模式表现假设我们想比较在不同游戏模式排位/匹配/大乱斗中的表现差异# 分组计算 mode_stats df.groupby(game_mode)[kda].apply(list) # 绘制水平箱线图 plt.figure(figsize(10, 6)) plt.boxplot( mode_stats.values, labelsmode_stats.index, vertFalse, widths0.6, showfliersTrue, flierpropsdict(markerx, markersize8) ) # 添加参考线 avg_kda df[kda].mean() plt.axvline(avg_kda, colorred, linestyle--, labelf全局平均 {avg_kda:.2f}) plt.title(不同游戏模式的KDA分布) plt.xlabel(KDA比率) plt.legend() plt.show()进阶技巧添加数据分布曲线from scipy.stats import gaussian_kde fig, ax plt.subplots(figsize(12, 8)) boxes ax.boxplot( hero_stats.values(), labelshero_stats.keys(), showfliersFalse, patch_artistTrue ) # 为每个箱线图添加分布曲线 for i, (hero, data) in enumerate(hero_stats.items()): # 计算核密度估计 density gaussian_kde(data) xs np.linspace(min(data), max(data), 200) ys density(xs) # 归一化并偏移到对应位置 ys ys / ys.max() * 0.4 ax.plot(xs, ys i 1, colorblue, alpha0.5) plt.yticks(range(1, len(hero_stats)1), hero_stats.keys()) plt.title(英雄KDA分布对比) plt.tight_layout()

更多文章