Matplotlib 3.8 与 Seaborn 0.12 对比:3种学生成绩分布可视化方案与代码优化 Matplotlib 3.8 与 Seaborn 0.12 对比3种学生成绩分布可视化方案与代码优化当我们需要分析学生成绩数据时选择合适的可视化工具至关重要。Matplotlib作为Python生态中最基础的绘图库提供了极高的灵活性而Seaborn则在Matplotlib基础上封装了更高级的统计图表接口。本文将对比这两个库最新版本Matplotlib 3.8和Seaborn 0.12在绘制成绩分布图时的差异并提供三种典型场景下的优化方案。1. 数据准备与环境配置在开始可视化前我们需要准备示例数据并配置绘图环境。假设我们有一个包含30名学生数学、英语和Python三门课程成绩的CSV文件import pandas as pd import numpy as np # 生成示例数据 np.random.seed(42) data { 学号: [f100{i:02d} for i in range(1, 31)], 数学: np.random.normal(75, 10, 30).astype(int), 英语: np.random.normal(80, 8, 30).astype(int), Python: np.random.normal(85, 7, 30).astype(int) } df pd.DataFrame(data) df.to_csv(student_scores.csv, indexFalse, encodingutf-8-sig) # 基础配置 import matplotlib.pyplot as plt import seaborn as sns plt.rcParams[font.sans-serif] [SimHei] # 解决中文显示问题 plt.rcParams[axes.unicode_minus] False # 解决负号显示问题关键统计量计算# 计算各科统计量 stats df[[数学, 英语, Python]].agg([mean, max, min, std]) print(stats.round(1))2. 单科成绩分布可视化对比2.1 Matplotlib直方图基础版plt.figure(figsize(10, 6)) plt.hist(df[数学], bins10, edgecolorblack, alpha0.7) plt.title(数学成绩分布(Matplotlib)) plt.xlabel(分数) plt.ylabel(人数) plt.grid(axisy, linestyle--, alpha0.7) plt.show()2.2 Seaborn直方图优化版plt.figure(figsize(10, 6)) sns.histplot(datadf, x数学, bins10, kdeTrue, edgecolorwhite, linewidth1.2) plt.title(数学成绩分布(Seaborn)) plt.xlabel(分数) plt.ylabel(人数) sns.despine() # 移除上方和右侧边框 plt.show()对比分析特性Matplotlib 3.8Seaborn 0.12代码简洁度基础更简洁KDE曲线支持需手动实现内置支持边框样式传统直角可优化去除颜色搭配基础专业配色多图集成需手动布局有高级接口3. 多科成绩对比可视化方案3.1 箱线图对比plt.figure(figsize(10, 6)) sns.boxplot(datadf[[数学, 英语, Python]], paletteSet2, width0.5) plt.title(三门课程成绩分布对比) plt.ylabel(分数) sns.despine(offset10) plt.show()3.2 小提琴图增强版plt.figure(figsize(12, 6)) sns.violinplot(datadf.melt(value_vars[数学, 英语, Python]), xvariable, yvalue, innerquartile, palettepastel, splitFalse) plt.title(成绩分布密度对比(小提琴图)) plt.xlabel(科目) plt.ylabel(分数) plt.grid(axisy, linestyle:, alpha0.5) plt.show()3.3 多图组合仪表板fig, axes plt.subplots(2, 2, figsize(14, 12)) # 直方图 sns.histplot(datadf, x数学, bins10, kdeTrue, axaxes[0,0]) axes[0,0].set_title(数学成绩分布) # 箱线图 sns.boxplot(datadf[[数学, 英语, Python]], axaxes[0,1]) axes[0,1].set_title(三科成绩对比) # 小提琴图 sns.violinplot(datadf.melt(value_vars[数学, 英语, Python]), xvariable, yvalue, axaxes[1,0]) axes[1,0].set_title(成绩密度分布) # 散点图 sns.scatterplot(datadf, x数学, yPython, size英语, hue英语, axaxes[1,1], paletteviridis, sizes(20, 200)) axes[1,1].set_title(数学与Python成绩关系) plt.tight_layout() plt.show()4. 高级定制与性能优化4.1 Matplotlib对象导向API优化fig, ax plt.subplots(figsize(10, 6)) # 使用更高效的bar容器 bars ax.bar(df[学号], df[数学], width0.7, linewidth1, edgecolorwhite) # 单独设置颜色 for bar in bars: if bar.get_height() 85: bar.set_color(#2ca02c) # 高于85分绿色 elif bar.get_height() 60: bar.set_color(#d62728) # 低于60分红色 # 添加参考线 ax.axhline(df[数学].mean(), colorblue, linestyle--, label平均分) ax.set_title(数学成绩分布(优化版)) ax.set_xlabel(学号) ax.set_ylabel(分数) ax.legend() plt.xticks(rotation45) plt.show()4.2 Seaborn主题与样式深度定制# 自定义主题 custom_style { axes.facecolor: #f5f5f5, grid.color: white, axes.grid: True, grid.linestyle: -, axes.edgecolor: 0.8 } sns.set_style(custom_style) plt.figure(figsize(12, 7)) plot sns.histplot(datadf, xPython, bins12, kdeTrue, huePython, palettecoolwarm, elementstep, legendFalse) plot.set_title(Python成绩分布(高级定制), pad20) plot.set_xlabel(分数, labelpad10) plot.set_ylabel(人数, labelpad10) # 添加注释 max_val df[Python].max() plot.annotate(f最高分: {max_val}, xy(max_val, 5), xytext(max_val5, 7), arrowpropsdict(arrowstyle-)) plt.show()5. 实际应用中的选择建议根据不同的分析需求我们可以做出以下推荐快速探索性分析优先使用Seaborn其高级接口可以快速生成具有统计意义的图表推荐图表displot()分布图、boxplot()箱线图学术论文/正式报告结合使用Matplotlib底层API和Seaborn样式关键技巧sns.set_style(whitegrid) # 设置背景样式 plt.rcParams[figure.dpi] 300 # 提高分辨率交互式仪表板使用Matplotlib的Figure和Axes对象构建复杂布局示例代码结构fig plt.figure(figsize(16, 10)) gs fig.add_gridspec(3, 3) ax1 fig.add_subplot(gs[0, :]) # 顶部全宽图表 ax2 fig.add_subplot(gs[1:, 0]) # 左侧纵向图表 ax3 fig.add_subplot(gs[1:, 1:]) # 右侧大图表性能优化技巧大数据集时使用numpy.histogram预计算直方图避免在循环中重复创建图形对象对于静态报告考虑保存为SVG格式获得更高清晰度# 高效绘制示例 bins np.linspace(df[数学].min(), df[数学].max(), 15) counts, edges np.histogram(df[数学], binsbins) plt.figure(figsize(10, 6)) plt.bar(edges[:-1], counts, widthnp.diff(edges), alignedge, edgecolorblack) plt.title(优化后的直方图(预计算bins)) plt.show()