使用 Matplotlib 与 Seaborn 可视化数据分布:以明尼苏达州鸟类数据集为例

发布时间:2026/9/11 8:30:23
使用 Matplotlib 与 Seaborn 可视化数据分布:以明尼苏达州鸟类数据集为例 使用 Matplotlib 与 Seaborn 可视化数据分布以明尼苏达州鸟类数据集为例【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners导读本篇文章来自 Data-Science-For-Beginners 课程第 10 课3-Data-Visualization/10-visualization-distributions围绕数据科学中极其核心的问题——数据是如何沿某一坐标轴分布的——展开。我们将基于课程仓库自带的明尼苏达州鸟类数据集data/birds.csv系统学习如何使用 Pandas Matplotlib 构建直方图histogram、2D 直方图以及如何使用 Seaborn 构建平滑的核密度估计图KDE density plot最终掌握从散点图粗看到直方图定量分析再到密度图精细刻画的完整分布可视化方法论。学完本文你将能够独立处理数值型与文本型两类特征并通过调节bins、bw_adjust、hue等关键参数挖掘数据背后的分布规律。本文所有代码示例均可在课程的 notebook.ipynb 中复现完整的可运行版本见 solution/notebook.ipynb。数据集概览导入 Pandas、Matplotlib 与鸟类数据在上一课第 9 课可视化数量中我们已经通过可视化离群值发现了一些错误数据并依据最大体长考察了不同鸟类类别之间的差异。本节课我们换一个分析视角不去比较单一数值的大小而是观察整个数据集的分布形态——例如明尼苏达州鸟类最大翼展MaxWingspan或最大体重MaxBodyMass的整体分布情况。首先在 notebook.ipynb 中导入 Pandas、Matplotlib 并读取数据import pandas as pd import matplotlib.pyplot as plt birds pd.read_csv(../../data/birds.csv) birds.head()提示相对路径../../data/birds.csv是相对于 notebook 所在目录3-Data-Visualization/10-visualization-distributions/的写法在仓库根目录中该文件即 data/birds.csv。数据集共包含 400 余条鸟类记录除名称、学名、分类学层级等文本字段外还提供了MinLength、MaxLength、MinBodyMass、MaxBodyMass、MinWingspan、MaxWingspan等数值字段以及ConservationStatus保护状态分类字段。前 5 行数据大致如下序号名称学名类别目科属保护状态最小区长最大区长最小区体重最大区体重最小翼展最大翼展0Black-bellied whistling-duckDendrocygna autumnalisDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygnaLC4756652102076941Fulvous whistling-duckDendrocygna bicolorDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygnaLC4553712105085932Snow gooseAnser caerulescensDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC6479205040501351653Rosss gooseAnser rossiiDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC57.364106615671131164Greater white-fronted gooseAnser albifronsDucks/Geese/WaterfowlAnseriformesAnatidaeAnserLC648119303310130165先用散点图获得分布的整体直觉在深入统计图表之前一个快速有效的做法是沿用上一课学过的散点图把每个数据点摊在坐标平面上肉眼即可判断数据沿坐标轴的疏密情况。birds.plot(kindscatter, xMaxLength, yOrder, figsize(12,8)) plt.title(Max Length per Order) plt.ylabel(Order) plt.xlabel(Max Length) plt.show()这张图见课程 images/scatter-wb.png给出了体长按鸟类目Order如何分布的整体概览可以看到大部分点云集中在中短体长区域而少数目拥有明显的长尾。不过散点图适合做定性概览却并不擅长精确表达分布在每个区间的密度到底是多少。这正是直方图的用武之地。用直方图刻画数值分布Matplotlib 为分布可视化提供了非常成熟的直方图工具。直方图在外观上类似条形图但其含义完全不同条形图比较的是不同类别的大小直方图展示的是连续数值按区间bin划分后的频数柱子的高低起伏即为分布形态。创建直方图只需指定图表类型为hist。以下代码绘制MaxBodyMass在整个数据集数值范围内的分布并通过bins参数将数据划分成 10 个小区间birds[MaxBodyMass].plot(kind hist, bins 10, figsize (12,12)) plt.show()可以看到数据集中的绝大部分鸟类最大体重集中在 2000 以下呈现出明显的右偏正偏形态——这符合生态学的直觉小型鸟类数量多超大体型的鸟类稀少。调节 bins 参数获取更精细的信息直方图的分辨率完全取决于bins。将分箱数量从 10 提升到 30birds[MaxBodyMass].plot(kind hist, bins 30, figsize (12,12)) plt.show()bins越大柱子越窄、越能反映局部的细节波动bins越小曲线越平滑、越容易看清整体趋势。实践中通常需要多次尝试找到一个既能保留结构又不引入噪声的分箱数。过滤数据以放大关注的分布区间上面的直方图整体右偏严重左侧高峰被压缩得很扁。若想观察体长较小的鸟类群体的分布细节可以先对 DataFrame 做布尔过滤再对子集绘制直方图。课程示例中按MaxBodyMass过滤出体重小于 60 的记录并设置bins 40filteredBirds birds[(birds[MaxBodyMass] 1) (birds[MaxBodyMass] 60)] filteredBirds[MaxBodyMass].plot(kind hist, bins 40, figsize (12,12)) plt.show()过滤后的直方图见 images/dist3-wb.png明显不再严重左偏柱状形态更加均匀能够更清楚地看出小体重区间内部的次高峰结构。✅ 动手练习尝试其他过滤条件与数据点组合如果想观察数据全貌可以去掉[MaxBodyMass]的列索引直接对 DataFrame 的数值列绘制带图例标签的分布图。2D 直方图同时观察两个分布的联合关系直方图还能进一步扩展为 2D 形式用于考察两个分布之间的相关关系。例如同时观察MaxBodyMass与MaxLengthMatplotlib 提供了内置的hist2d方法用颜色亮度表示某个二维区间的聚集程度x filteredBirds[MaxBodyMass] y filteredBirds[MaxLength] fig, ax plt.subplots(tight_layoutTrue) hist ax.hist2d(x, y)从输出图见 images/2D-wb.png可以观察到这两个量沿着预期的轴线存在清晰的线性相关趋势且在某一点附近存在一个格外明亮的聚集点——那通常对应数据集中的一个主要类群。文本数据的分布按保护状态叠加直方图到目前为止我们处理的都是数值列。但本数据集还包含非常有价值的分类信息类别Category、属Genus、种、科Family以及保护状态ConservationStatus。例如我们想知道鸟类按保护状态划分其分布是怎样的数据集中的保护状态采用 IUCN 红色名录IUCN Red List Categories的缩写CR极危Critically EndangeredEN濒危EndangeredEX灭绝ExtinctLC无危Least ConcernNT近危Near ThreatenedVU易危Vulnerable由于这些是文本值不能直接喂给直方图需要先用loc按状态分别取出对应的数值列这里取MinWingspan再逐一绘制叠加的直方图x1 filteredBirds.loc[filteredBirds.ConservationStatusEX, MinWingspan] x2 filteredBirds.loc[filteredBirds.ConservationStatusCR, MinWingspan] x3 filteredBirds.loc[filteredBirds.ConservationStatusEN, MinWingspan] x4 filteredBirds.loc[filteredBirds.ConservationStatusNT, MinWingspan] x5 filteredBirds.loc[filteredBirds.ConservationStatusVU, MinWingspan] x6 filteredBirds.loc[filteredBirds.ConservationStatusLC, MinWingspan] kwargs dict(alpha0.5, bins20) plt.hist(x1, **kwargs, colorred, labelExtinct) plt.hist(x2, **kwargs, colororange, labelCritically Endangered) plt.hist(x3, **kwargs, coloryellow, labelEndangered) plt.hist(x4, **kwargs, colorgreen, labelNear Threatened) plt.hist(x5, **kwargs, colorblue, labelVulnerable) plt.hist(x6, **kwargs, colorgray, labelLeast Concern) plt.gca().set(titleConservation Status, ylabelMin Wingspan) plt.legend();这里的关键参数值得说明alpha0.5设置半透明填充使多个直方图叠加时互相可见bins20统一的区间数保证各组数据按相同刻度对齐color/label分别为每个状态指定颜色与图例标签直接调用plt.legend()即可生成图例。从结果看最小翼展与保护状态之间并没有呈现出明显的强相关——各状态的分布大致重叠。你可以用同样的方法测试数据集中的其他字段并尝试不同过滤器看看是否能找到有意义的关联。密度图Density Plot用 Seaborn 平滑分布曲线细心的读者可能已经注意到前面绘制的直方图都是阶梯状的边缘并不平滑。如果想得到一条平滑的分布曲线就需要引入密度图density plot它基于核密度估计Kernel Density Estimation, KDE技术将每个样本点摊成一个核函数后叠加从而得到连续的密度曲线。Seaborn 是本节引入的新可视化库其kdeplot方法即可完成这一工作。先加载 Seaborn绘制MinWingspan的基础密度图import seaborn as sns import matplotlib.pyplot as plt sns.kdeplot(filteredBirds[MinWingspan]) plt.show()输出见 images/density1.png与之前的最小翼展直方图形态一致但曲线平滑得多。正如 Seaborn 官方文档所言与直方图相比KDE 产生的图形更简洁、更易解释尤其在同时绘制多个分布时优势明显但如果底层分布有界或不光滑KDE 也可能引入失真。与直方图一样表示质量同样取决于平滑参数的选择。换言之离群值依然会让你的图表行为怪异。用 kdeplot 平滑锯齿状的直方图回到之前用bins30绘制的那张锯齿明显的MaxBodyMass直方图用 KDE 重绘即可得到平滑的曲线sns.kdeplot(filteredBirds[MaxBodyMass]) plt.show()如果觉得默认曲线过于光滑想保留一些细节可以调整bw_adjust参数带宽调整系数。值越小带宽越窄曲线越贴合原始数据、越毛糙sns.kdeplot(filteredBirds[MaxBodyMass], bw_adjust.2) plt.show()对比可见 images/density2.png默认带宽平滑与 images/density3.pngbw_adjust.2更少平滑、保留了更多局部起伏。✅ 建议查阅kdeplot的可用参数并自行实验bw_adjust、cut、clip、gridsize等对曲线形态的影响。用 hue 分组一目了然地比较多个类别的密度密度图最强大的场景是在单张图中叠加多个分组。例如仅用几行代码就可以展示最大体重按鸟类目Order的密度分布sns.kdeplot( datafilteredBirds, xMaxBodyMass, hueOrder, fillTrue, common_normFalse, palettecrest, alpha.5, linewidth0, )各参数含义data/x指定 DataFrame 与数值列hueOrder按目对曲线着色并分组fillTrue对曲线下方区域进行填充common_normFalse各组独立归一化保证每一组的曲线面积都归一为 1从而公平比较各组内部的形状而不是受样本量影响palettecrest选择 Seaborn 内置的渐变色板alpha.5填充透明度linewidth0不绘制描边线。二维密度图观察两个变量的联合密度kdeplot同样支持二维形式把x与y同时传入即可。下面的代码对比鸟的最小体长MinLength与最大体长MaxLength并按保护状态着色sns.kdeplot(datafilteredBirds, xMinLength, yMaxLength, hueConservationStatus)输出见 images/multi.png呈现出多个同心等高线状的密度云。观察结果值得进一步探究易危Vulnerable鸟类的长度分布是否形成了一个有统计意义的独立聚类这类二维密度图常用于在分类任务之前快速判断不同类别在特征空间中的可分性。实践挑战与课后作业 挑战直方图相比散点图、条形图和折线图是更复杂的一类图表。请自行检索直方图的优秀应用案例思考并回答三个问题它们被用在什么场景它们能论证或揭示什么在哪些研究领域或行业中最常见作业参照课程 assignment.md 的要求将本课学到的技能迁移到另一个全新的数据集例如来自公开数据竞赛平台的数据构建一个 notebook围绕该数据集讲述一个故事讨论时至少使用 5 张直方图来发现数据的事实对数据集来源加以注释说明。评分标准可参考该文件中的 Rubric优秀的作业应包含完整注释、注明数据来源并使用不少于 5 张直方图缺注释或含 bug 则相应降档。小结与延伸阅读本节课完成了从 Matplotlib 到 Seaborn 的分布可视化进阶用 Pandas 读取 data/birds.csv 并快速预览用散点图获得分布的整体直觉用bins可调的直方图刻画数值分布的形态并通过布尔过滤聚焦感兴趣区间用hist2d观察两个数值分布的联合聚集用分组plt.hist处理文本类别保护状态的分布对比用 Seabornkdeplot获得平滑密度曲线掌握bw_adjust、hue、fill、common_norm等核心参数并延伸至二维密度图。若想深入学习建议阅读 solution/notebook.ipynb对照本课全部图表的完整可运行代码查阅 Seaborn 中kdeplot的文档理解一维或多维的连续概率密度曲线的实现细节结合本系列课程的其余章节如第 11 课比例可视化、第 12 课关系可视化建立完整的可视化工具箱。记住本文反复强调的要点直方图的bins决定分辨率KDE 的bw_adjust决定平滑程度而离群值永远是这两类图表的隐形敌人——先清洗、再可视化是数据科学中颠扑不破的准则。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询