Matplotlib Seaborn 数据可视化标签 #Python #Matplotlib #Seaborn #数据可视化学习周期1.5 天 | 核心目标掌握 Matplotlib 和 Seaborn 的基本绘图方法能完成图表美化、子图布局及统计可视化4.3 Matplotlib Seaborn可视化数据可视化是数据分析的关键环节通过图形直观展示数据规律。Matplotlib 是 Python 最基础的绘图库Seaborn 是基于 Matplotlib 的高级统计绘图库语法更简洁样式更美观。Matplotlib灵活性极高可绘制几乎所有类型的图表是后续所有可视化库的基础缺点是默认样式较朴素代码量稍多。Seaborn默认样式更美观封装了大量高级统计图表如热力图、pairplot代码更简洁适合快速完成统计可视化。安装与导入pip install matplotlib seabornimport matplotlib.pyplot as plt import seaborn as sns import numpy as np import pandas as pd # 设置中文显示解决 Matplotlib 中文乱码 plt.rcParams[font.sans-serif] [SimHei] # 或 [Arial Unicode MS] plt.rcParams[axes.unicode_minus] False # 解决负号显示问题 # Seaborn 设置样式全局 sns.set_style(whitegrid) # 白色网格样式简洁美观4.3.1 基本绘图折线图、散点图、柱状图、直方图、箱线图1. 折线图Line Plot适合展示数据随时间变化的趋势。x np.arange(1, 11) # [1,2,...,10] y1 np.array([5, 7, 6, 9, 8, 12, 10, 13, 11, 15]) y2 np.array([3, 5, 7, 6, 8, 9, 11, 12, 14, 16]) # Matplotlib 绘制 plt.plot(x, y1, label产品A, colorblue, linewidth2, markero) plt.plot(x, y2, label产品B, colorred, linewidth2, markers, linestyle--) plt.title(产品销量随时间变化趋势, fontsize14) plt.xlabel(时间天, fontsize12) plt.ylabel(销量件, fontsize12) plt.legend() plt.grid(True, alpha0.3) plt.show() # Seaborn 绘制更简洁 sns.lineplot(xx, yy1, label产品A, markero) sns.lineplot(xx, yy2, label产品B, markers, linestyle--) plt.title(产品销量随时间变化趋势, fontsize14) plt.show()关键参数color折线颜色linewidth线宽marker数据点标记o圆点、s方形、^三角形linestyle线型-实线、--虚线、-.点划线2. 散点图Scatter Plot展示两个变量之间的关系。# 生成数据学习时间与成绩正相关 np.random.seed(42) study_time np.random.randint(1, 10, 50) score study_time * 8 np.random.randn(50) * 2 # Matplotlib 绘制 plt.scatter(study_time, score, colorgreen, alpha0.6, s50, edgecolorblack) plt.title(学习时间与成绩相关性, fontsize14) plt.xlabel(学习时间小时) plt.ylabel(成绩分) plt.show() # Seaborn 绘制支持按类别着色 df pd.DataFrame({study_time: study_time, score: score}) sns.scatterplot(xstudy_time, yscore, datadf, colorgreen, alpha0.7) plt.show()3. 柱状图Bar Plot比较不同类别的数值大小。categories [一班, 二班, 三班, 四班] values [85.2, 79.5, 88.1, 82.7] # Matplotlib 绘制 plt.bar(categories, values, color[#FF6B6B, #4ECDC4, #45B7D1, #96CEB4], edgecolorblack) plt.title(不同班级平均分对比, fontsize14) plt.ylabel(平均分分) for i, v in enumerate(values): plt.text(i, v 0.5, str(v), hacenter) plt.show() # Seaborn 绘制 sns.barplot(xcategories, yvalues, paletteBlues, edgecolorblack) plt.title(不同班级平均分对比, fontsize14) plt.show()4. 直方图Histogram展示数据分布。scores np.random.normal(80, 5, 1000) # 均值80标准差5 # Matplotlib 绘制 plt.hist(scores, bins15, colorskyblue, edgecolorblack, alpha0.7) plt.axvline(scores.mean(), colorred, linestyle--, labelf均值{scores.mean():.1f}) plt.title(学生成绩分布直方图) plt.xlabel(成绩分) plt.ylabel(学生人数) plt.legend() plt.show() # Seaborn 绘制含核密度曲线 sns.histplot(scores, bins15, kdeTrue, colorskyblue, edgecolorblack) plt.axvline(scores.mean(), colorred, linestyle--) plt.show()5. 箱线图Box Plot展示数据的分布、中位数、四分位数及异常值。# 生成三组数据 class1 np.random.normal(80, 5, 50) class2 np.random.normal(75, 8, 50) class3 np.random.normal(85, 6, 50) # Matplotlib 绘制 plt.boxplot([class1, class2, class3], labels[一班, 二班, 三班], patch_artistTrue) plt.title(不同班级成绩箱线图) plt.ylabel(成绩分) plt.show() # Seaborn 绘制 df pd.DataFrame({ 成绩: np.concatenate([class1, class2, class3]), 班级: [一班]*50 [二班]*50 [三班]*50 }) sns.boxplot(x班级, y成绩, datadf, palettelightblue) plt.show()4.3.2 子图布局plt.subplots()使用subplots可以在一张图中创建多个子图方便对比。# 创建 2x2 子图 fig, axes plt.subplots(2, 2, figsize(12, 10)) # 子图1折线图 axes[0, 0].plot(x, y1, b-o) axes[0, 0].set_title(折线图) # 子图2散点图 axes[0, 1].scatter(study_time, score, alpha0.6) axes[0, 1].set_title(散点图) # 子图3柱状图 axes[1, 0].bar(categories, values, colorskyblue) axes[1, 0].set_title(柱状图) # 子图4直方图 axes[1, 1].hist(scores, bins20, edgecolorblack) axes[1, 1].set_title(直方图) plt.tight_layout() # 自动调整间距 plt.show()关键技巧figsize(宽, 高)单位为英寸根据子图数量调整。子图的标题、标签需用axes[i,j].set_title()而非plt.title()。plt.tight_layout()自动调整间距避免重叠。4.3.3 图表美化标题、标签、图例、颜色、样式1. 标题与标签美化plt.plot(x, y1, label产品A) plt.title(产品销量趋势, fontsize16, fontweightbold, color#333333, pad20) plt.xlabel(时间天, fontsize14, fontweightbold) plt.ylabel(销量件, fontsize14) plt.xticks(fontsize12) plt.yticks(fontsize12) plt.show()2. 图例美化plt.legend(locupper left, fontsize12, frameonTrue, fancyboxTrue, shadowTrue)3. 颜色优化使用 Seaborn 内置调色板paletteBlues、Set2、Pastel1自定义十六进制颜色[#FF6B6B, #4ECDC4, #45B7D1]4. 整体样式设置sns.set_style(whitegrid) # 白色网格 # sns.set_style(darkgrid) # 深色网格 # sns.set_style(white) # 无网格5. 细节优化去除顶部和右侧边框、添加注释ax plt.gca() ax.spines[top].set_visible(False) ax.spines[right].set_visible(False) ax.grid(True, linestyle--, alpha0.5) # 添加注释 plt.annotate(峰值, xy(peak_x, peak_y), xytext(peak_x0.5, peak_y1), arrowpropsdict(arrowstyle-, colorred))4.3.4 Seaborn 高级统计图热力图、pairplot、分类图1. 热力图Heatmap展示矩阵数据如相关系数矩阵。# 相关系数矩阵 df pd.DataFrame(np.random.randn(100, 4), columns[A, B, C, D]) corr df.corr() sns.heatmap(corr, annotTrue, cmapRdBu_r, fmt.2f, linewidths0.5, squareTrue) plt.title(特征相关性热力图) plt.show()2. pairplot成对关系图展示多个数值变量两两之间的关系。# 使用内置 iris 数据集 iris sns.load_dataset(iris) sns.pairplot(iris, huespecies, diag_kindhist, markers[o, s, D]) plt.show()3. 分类图Categorical Plotssns.barplot带误差棒的柱状图sns.boxplot箱线图按类别分组sns.violinplot小提琴图sns.countplot计数柱状图tips sns.load_dataset(tips) # 条形图 sns.barplot(xday, ytotal_bill, datatips, paletteBlues) plt.title(每日总账单平均值) # 箱线图 sns.boxplot(xday, ytotal_bill, datatips, paletteSet2) # 小提琴图 sns.violinplot(xday, ytotal_bill, datatips, palettemuted)练习项目Titanic 数据集分析不同船舱等级的存活率需求分析 Titanic 数据集中不同船舱等级Pclass的存活率并用柱状图展示结果。步骤与代码import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 1. 加载数据Seaborn 内置或本地文件 titanic sns.load_dataset(titanic) # 或 pd.read_csv(train.csv) # 2. 计算不同船舱等级的存活率 survival_rate titanic.groupby(pclass)[survived].mean() print(survival_rate) # 输出示例 # pclass # 1 0.629630 # 2 0.472826 # 3 0.242363 # 3. 绘制柱状图 plt.figure(figsize(8, 6)) ax sns.barplot(xpclass, ysurvived, datatitanic, ciNone, paletteviridis) plt.title(不同船舱等级Pclass的存活率, fontsize14) plt.xlabel(船舱等级, fontsize12) plt.ylabel(存活率, fontsize12) plt.ylim(0, 0.7) # 添加数值标签 for i, p in enumerate(ax.patches): ax.annotate(f{p.get_height()*100:.1f}%, (p.get_x() p.get_width()/2., p.get_height()), hacenter, vabottom, fontsize11) # 美化去除顶部和右侧边框 sns.despine() plt.show() # 4. 额外分析不同等级 性别的存活率 sns.barplot(xpclass, ysurvived, huesex, datatitanic, ciNone, paletteSet2) plt.title(不同船舱等级与性别的存活率) plt.show()结论一等舱存活率最高约 63%二等舱约 47%三等舱约 24%。女性存活率普遍高于男性且一等舱女性存活率接近 97%。 学习资料Obsidian 可直接收藏官方文档Matplotlib 官方教程Seaborn 官方教程中文教程菜鸟教程 - MatplotlibSeaborn 中文文档配色参考Matplotlib 颜色Seaborn 调色板数据集Titanic 数据集Kaggle 学习建议1.5 天计划第 1 天上午掌握 Matplotlib 基础图形折线图、散点图、柱状图、直方图、箱线图练习子图布局和基础美化。第 1 天下午学习 Seaborn 高级统计图热力图、pairplot、分类图理解其与 Matplotlib 的配合。第 2 天完成 Titanic 数据分析项目巩固可视化全流程。✅ 核心要点总结Matplotlib底层绘图库灵活性高适合精细控制图表。Seaborn高级封装语法简洁内置漂亮样式和统计功能。常用图形折线图趋势散点图相关性柱状图比较直方图分布箱线图统计摘要热力图矩阵数据pairplot多变量关系美化要素标题、标签、图例、颜色映射、网格、样式主题、去除多余边框。子图布局plt.subplots()创建多子图tight_layout()自动调整间距。实战流程数据加载 → 数据处理 → 计算指标 → 绘制图表 → 美化 → 结论分析。练习题自测绘制一个包含两条曲线的折线图添加图例、网格和标题。生成两组随机数据绘制散点图并添加回归线可使用 Seaborn 的regplot。创建一个 2×2 的子图布局分别绘制柱状图、箱线图、直方图和热力图。使用 Seaborn 的pairplot分析 iris 数据集按 species 着色。完成 Titanic 项目后尝试分析“年龄分布与存活率”的关系用直方图或箱线图展示。建议使用 Jupyter Notebook 逐行运行示例观察图表效果并修改参数。