1. 为什么需要分布图当你拿到一份新数据时第一件事是什么我通常会先看看各个变量的分布情况。这就像侦探破案前先观察现场医生诊断前先看检查报告一样重要。分布图能直观展示数据的长相数据集中在哪个范围有没有异常值是正态分布还是偏态分布这些信息对后续分析至关重要。比如在金融风控中识别出收入分布的异常值可能意味着欺诈行为在医学研究中血压值的分布形态可能影响治疗方案的选择。Python生态中有三大可视化利器Matplotlib基础绘图库灵活但代码稍显繁琐Seaborn基于Matplotlib的高级封装统计图表开箱即用SciencePlots科研风格的绘图样式库让图表瞬间拥有学术范儿# 三大库的典型导入方式 import matplotlib.pyplot as plt import seaborn as sns import scienceplots # 样式库无需直接调用通过plt.style使用2. 单变量分布可视化实战2.1 直方图数据分布的骨架直方图是最基础的分布展示方法它将数据划分为若干区间bin用柱子的高度表示落入该区间的数据量。在Seaborn中histplot是最常用的单变量分布绘图函数# 加载经典的鸢尾花数据集 iris sns.load_dataset(iris) plt.figure(figsize(10, 6)) sns.histplot(datairis, xsepal_length, bins20, kdeTrue) plt.title(萼片长度分布直方图) plt.xlabel(长度(cm)) plt.ylabel(频数)这里有几个关键参数值得注意bins控制柱子数量影响分布细节的呈现kde是否叠加核密度曲线默认Falsehue用颜色区分不同类别的分布适合分类数据小技巧当数据量较小时可以添加rugTrue参数在x轴上显示实际数据点避免直方图bins划分带来的误导。2.2 密度图平滑的分布曲线核密度估计KDE通过平滑处理得到连续的概率密度曲线特别适合展示分布形态with plt.style.context([science, no-latex]): # 使用科研风格 plt.figure(figsize(10, 6)) sns.kdeplot(datairis, xpetal_length, huespecies, fillTrue) plt.title(不同种类鸢尾花的花瓣长度分布) plt.xlabel(花瓣长度(cm))密度图的优势在于不受bins划分影响展现真实的分布形状方便比较多个分布的差异能清晰展示数据的波峰和波谷2.3 箱线图五数概括法箱线图用五个关键数字概括数据分布最小值、第一四分位数(Q1)、中位数、第三四分位数(Q3)和最大值。异常值会单独显示为点plt.figure(figsize(8, 6)) sns.boxplot(datairis, ysepal_width, xspecies, paletteSet2, width0.6) plt.title(不同种类鸢尾花的萼片宽度分布) plt.ylabel(宽度(cm))箱线图特别适合快速识别异常值离群点比较不同组别的分布差异了解数据的偏态和离散程度3. 多变量联合分布分析3.1 双变量关系可视化当需要分析两个变量的关系时散点图是最直观的选择。Seaborn的jointplot在此基础上做了增强sns.jointplot(datairis, xsepal_length, ysepal_width, kindscatter, huespecies, height8)kind参数支持多种展示形式scatter经典散点图默认hex蜂窝图适合大数据量kde二维核密度估计reg带回归线的散点图3.2 多变量关系矩阵pairplot可以一次性展示数据集中所有数值变量的两两关系sns.pairplot(iris, huespecies, cornerTrue, plot_kws{alpha: 0.8, s: 50})关键参数说明corner只显示下三角矩阵避免重复diag_kind对角线图的类型可选hist或kdeplot_kws传递给非对角线图的参数3.3 相关性热力图对于数值变量间的相关性分析热力图是最佳选择# 计算相关系数矩阵 corr iris.select_dtypes(number).corr() plt.figure(figsize(8, 6)) sns.heatmap(corr, annotTrue, fmt.2f, cmapcoolwarm, vmin-1, vmax1, linewidths0.5) plt.title(鸢尾花特征相关性热力图)热力图的优化技巧使用annot显示具体数值选择色盲友好的配色如coolwarm通过vmin和vmax固定颜色范围4. 高级技巧风格化与函数封装4.1 科研风格美化SciencePlots库提供了多种学术期刊风格的绘图模板styles [science, ieee, grid] # 可选风格 with plt.style.context([science, no-latex]): plt.figure(figsize(10, 6)) sns.histplot(datairis, xsepal_length, kdeTrue) plt.savefig(science_style.png, dpi300)常见风格包括science通用科研风格ieeeIEEE期刊风格natureNature期刊风格grid带网格线的简洁风格4.2 实用封装函数将常用绘图逻辑封装成函数可以大幅提升效率def plot_distribution(data, x, hueNone, kindhist, style[science], save_pathNone): 通用分布绘图函数 参数 data: 数据集(DataFrame) x: 要绘制的变量名 hue: 分组变量名 kind: 图表类型(hist/kde/box) style: 绘图风格列表 save_path: 图片保存路径 with plt.style.context(style): fig, ax plt.subplots(figsize(10, 6)) if kind hist: sns.histplot(datadata, xx, huehue, kdeTrue, axax) elif kind kde: sns.kdeplot(datadata, xx, huehue, fillTrue, axax) elif kind box: sns.boxplot(datadata, xhue, yx, axax) if save_path: plt.savefig(save_path, dpi300, bbox_inchestight) plt.show()4.3 多图排版技巧使用plt.subplots可以创建复杂的多图布局fig, axes plt.subplots(2, 2, figsize(12, 10)) # 左上角直方图 sns.histplot(datairis, xsepal_length, axaxes[0,0]) # 右上角箱线图 sns.boxplot(datairis, ysepal_length, xspecies, axaxes[0,1]) # 左下角散点图 sns.scatterplot(datairis, xsepal_length, ysepal_width, huespecies, axaxes[1,0]) # 右下角密度图 sns.kdeplot(datairis, xsepal_length, ysepal_width, levels5, fillTrue, axaxes[1,1]) plt.tight_layout() # 自动调整子图间距5. 避坑指南与性能优化5.1 常见问题解决中文显示问题plt.rcParams[font.sans-serif] [SimHei] # Windows plt.rcParams[font.sans-serif] [Arial Unicode MS] # MacSciencePlots兼容性问题 当遇到样式冲突时可以plt.style.use([science, no-latex]) # 禁用LaTeX渲染大数据量绘图卡顿对散点图使用alpha参数设置透明度对直方图减少bins数量考虑使用hexbin替代普通散点图5.2 图表输出最佳实践高质量论文图表通常需要矢量格式保存PDF/EPSplt.savefig(figure.pdf, formatpdf)设置合适的分辨率plt.savefig(figure.png, dpi600) # 印刷级质量控制边界空白plt.savefig(figure.jpg, bbox_inchestight, pad_inches0.1)在实际项目中我习惯将绘图配置封装成装饰器这样既能保持图表风格一致又能减少重复代码。比如设置统一的字体、颜色主题和图表尺寸def research_style(func): def wrapper(*args, **kwargs): plt.style.use([science, no-latex]) plt.rcParams.update({ font.size: 12, axes.titlesize: 14, axes.labelsize: 12, figure.figsize: (8, 6) }) return func(*args, **kwargs) return wrapper research_style def plot_advanced(data): # 绘图代码...
【Python可视化】从单变量到多变量:分布图绘制实战与风格化封装
1. 为什么需要分布图当你拿到一份新数据时第一件事是什么我通常会先看看各个变量的分布情况。这就像侦探破案前先观察现场医生诊断前先看检查报告一样重要。分布图能直观展示数据的长相数据集中在哪个范围有没有异常值是正态分布还是偏态分布这些信息对后续分析至关重要。比如在金融风控中识别出收入分布的异常值可能意味着欺诈行为在医学研究中血压值的分布形态可能影响治疗方案的选择。Python生态中有三大可视化利器Matplotlib基础绘图库灵活但代码稍显繁琐Seaborn基于Matplotlib的高级封装统计图表开箱即用SciencePlots科研风格的绘图样式库让图表瞬间拥有学术范儿# 三大库的典型导入方式 import matplotlib.pyplot as plt import seaborn as sns import scienceplots # 样式库无需直接调用通过plt.style使用2. 单变量分布可视化实战2.1 直方图数据分布的骨架直方图是最基础的分布展示方法它将数据划分为若干区间bin用柱子的高度表示落入该区间的数据量。在Seaborn中histplot是最常用的单变量分布绘图函数# 加载经典的鸢尾花数据集 iris sns.load_dataset(iris) plt.figure(figsize(10, 6)) sns.histplot(datairis, xsepal_length, bins20, kdeTrue) plt.title(萼片长度分布直方图) plt.xlabel(长度(cm)) plt.ylabel(频数)这里有几个关键参数值得注意bins控制柱子数量影响分布细节的呈现kde是否叠加核密度曲线默认Falsehue用颜色区分不同类别的分布适合分类数据小技巧当数据量较小时可以添加rugTrue参数在x轴上显示实际数据点避免直方图bins划分带来的误导。2.2 密度图平滑的分布曲线核密度估计KDE通过平滑处理得到连续的概率密度曲线特别适合展示分布形态with plt.style.context([science, no-latex]): # 使用科研风格 plt.figure(figsize(10, 6)) sns.kdeplot(datairis, xpetal_length, huespecies, fillTrue) plt.title(不同种类鸢尾花的花瓣长度分布) plt.xlabel(花瓣长度(cm))密度图的优势在于不受bins划分影响展现真实的分布形状方便比较多个分布的差异能清晰展示数据的波峰和波谷2.3 箱线图五数概括法箱线图用五个关键数字概括数据分布最小值、第一四分位数(Q1)、中位数、第三四分位数(Q3)和最大值。异常值会单独显示为点plt.figure(figsize(8, 6)) sns.boxplot(datairis, ysepal_width, xspecies, paletteSet2, width0.6) plt.title(不同种类鸢尾花的萼片宽度分布) plt.ylabel(宽度(cm))箱线图特别适合快速识别异常值离群点比较不同组别的分布差异了解数据的偏态和离散程度3. 多变量联合分布分析3.1 双变量关系可视化当需要分析两个变量的关系时散点图是最直观的选择。Seaborn的jointplot在此基础上做了增强sns.jointplot(datairis, xsepal_length, ysepal_width, kindscatter, huespecies, height8)kind参数支持多种展示形式scatter经典散点图默认hex蜂窝图适合大数据量kde二维核密度估计reg带回归线的散点图3.2 多变量关系矩阵pairplot可以一次性展示数据集中所有数值变量的两两关系sns.pairplot(iris, huespecies, cornerTrue, plot_kws{alpha: 0.8, s: 50})关键参数说明corner只显示下三角矩阵避免重复diag_kind对角线图的类型可选hist或kdeplot_kws传递给非对角线图的参数3.3 相关性热力图对于数值变量间的相关性分析热力图是最佳选择# 计算相关系数矩阵 corr iris.select_dtypes(number).corr() plt.figure(figsize(8, 6)) sns.heatmap(corr, annotTrue, fmt.2f, cmapcoolwarm, vmin-1, vmax1, linewidths0.5) plt.title(鸢尾花特征相关性热力图)热力图的优化技巧使用annot显示具体数值选择色盲友好的配色如coolwarm通过vmin和vmax固定颜色范围4. 高级技巧风格化与函数封装4.1 科研风格美化SciencePlots库提供了多种学术期刊风格的绘图模板styles [science, ieee, grid] # 可选风格 with plt.style.context([science, no-latex]): plt.figure(figsize(10, 6)) sns.histplot(datairis, xsepal_length, kdeTrue) plt.savefig(science_style.png, dpi300)常见风格包括science通用科研风格ieeeIEEE期刊风格natureNature期刊风格grid带网格线的简洁风格4.2 实用封装函数将常用绘图逻辑封装成函数可以大幅提升效率def plot_distribution(data, x, hueNone, kindhist, style[science], save_pathNone): 通用分布绘图函数 参数 data: 数据集(DataFrame) x: 要绘制的变量名 hue: 分组变量名 kind: 图表类型(hist/kde/box) style: 绘图风格列表 save_path: 图片保存路径 with plt.style.context(style): fig, ax plt.subplots(figsize(10, 6)) if kind hist: sns.histplot(datadata, xx, huehue, kdeTrue, axax) elif kind kde: sns.kdeplot(datadata, xx, huehue, fillTrue, axax) elif kind box: sns.boxplot(datadata, xhue, yx, axax) if save_path: plt.savefig(save_path, dpi300, bbox_inchestight) plt.show()4.3 多图排版技巧使用plt.subplots可以创建复杂的多图布局fig, axes plt.subplots(2, 2, figsize(12, 10)) # 左上角直方图 sns.histplot(datairis, xsepal_length, axaxes[0,0]) # 右上角箱线图 sns.boxplot(datairis, ysepal_length, xspecies, axaxes[0,1]) # 左下角散点图 sns.scatterplot(datairis, xsepal_length, ysepal_width, huespecies, axaxes[1,0]) # 右下角密度图 sns.kdeplot(datairis, xsepal_length, ysepal_width, levels5, fillTrue, axaxes[1,1]) plt.tight_layout() # 自动调整子图间距5. 避坑指南与性能优化5.1 常见问题解决中文显示问题plt.rcParams[font.sans-serif] [SimHei] # Windows plt.rcParams[font.sans-serif] [Arial Unicode MS] # MacSciencePlots兼容性问题 当遇到样式冲突时可以plt.style.use([science, no-latex]) # 禁用LaTeX渲染大数据量绘图卡顿对散点图使用alpha参数设置透明度对直方图减少bins数量考虑使用hexbin替代普通散点图5.2 图表输出最佳实践高质量论文图表通常需要矢量格式保存PDF/EPSplt.savefig(figure.pdf, formatpdf)设置合适的分辨率plt.savefig(figure.png, dpi600) # 印刷级质量控制边界空白plt.savefig(figure.jpg, bbox_inchestight, pad_inches0.1)在实际项目中我习惯将绘图配置封装成装饰器这样既能保持图表风格一致又能减少重复代码。比如设置统一的字体、颜色主题和图表尺寸def research_style(func): def wrapper(*args, **kwargs): plt.style.use([science, no-latex]) plt.rcParams.update({ font.size: 12, axes.titlesize: 14, axes.labelsize: 12, figure.figsize: (8, 6) }) return func(*args, **kwargs) return wrapper research_style def plot_advanced(data): # 绘图代码...