)
Data-Science-For-Beginners 第 9 课用 Matplotlib 可视化数据数量折线图、散点图与柱状图实战【免费下载链接】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 数据可视化模块的开篇课程对应课程索引中的 Visualizing Quantities围绕数量quantity这一核心概念基于明尼苏达州鸟类Minnesota Birds数据集系统讲解如何使用 Python 生态中经典的 Matplotlib 库绘制折线图、散点图和柱状图。读完本文你将掌握一套从检查数据 → 选择图表类型 → 过滤异常值 → 输出可读图表的完整可视化工作流并能在 Jupyter Notebook 中独立复现每一步。课程背景与数据集概览本课使用的数据是仓库根目录下的 data/birds.csv来自 Wikipedia 上明尼苏达州鸟类名录是一份清洗过的文本与数值混合数据集。从源码文件实测该 CSV 共 442 行1 行表头 441 条记录包含 13 个字段字段含义Name鸟类英文俗名ScientificName学名Category类别如 Ducks/Geese/WaterfowlOrder/Family/Genus林奈分类学中的目、科、属ConservationStatus保护状态如 LCMinLength/MaxLength最小 / 最大体长cmMinBodyMass/MaxBodyMass最小 / 最大体重gMinWingspan/MaxWingspan最小 / 最大翼展cm数据前几行示例与课程 notebook 展示一致NameCategoryOrderFamilyGenusMaxLengthMaxWingspanBlack-bellied whistling-duckDucks/Geese/WaterfowlAnseriformesAnatidaeDendrocygna5694Snow gooseDucks/Geese/WaterfowlAnseriformesAnatidaeAnser79165Greater white-fronted gooseDucks/Geese/WaterfowlAnseriformesAnatidaeAnser81165数据集的来源与版权说明可参见 数据可视化模块首页明尼苏达鸟类数据由 Hannah Collins 从 Wikipedia 抓取与蜂蜜产量、蘑菇等数据集一样遵循 CC0 公有领域许可。此外本课程还提供了 R 语言实现版本见 R/09-visualization-quantities方便对比学习。Matplotlib 绘图流程与图表选型Matplotlib 是 Python 中既能绘制简单图表、也能绘制复杂图形的经典库。用这类库绘图的一般流程包括四步锁定目标确定 DataFrame 中要分析的列数据变换按需过滤、分组、聚合映射坐标指定 x 轴与 y 轴取值选型出图决定图表类型并显示。图表类型应与数据结构和你想讲述的故事匹配课程给出了清晰的选型指南分析随时间变化的趋势 →折线图比较数值大小 → 柱状图、条形图、饼图、散点图展示部分与整体的关系 → 饼图展示数据分布 → 散点图、柱状图展示趋势 → 折线图、柱状图展示数值间的关系 → 折线图、散点图、气泡图本课聚焦数量可视化最常用的三种折线图line chart、散点图scatterplot、柱状图bar plot。所有练习均在课程的 notebook.ipynb位于课程目录根部中完成新建单元格逐步添加代码即可。用折线图观察鸟类翼展首先加载数据。课程 notebook 默认从仓库根目录下的data文件夹读取import pandas as pd import matplotlib.pyplot as plt birds pd.read_csv(../../data/birds.csv) birds.head()如果直接打开 data/birds.csv可确认列名与上述示例完全一致首行即 13 个字段名UTF-8 编码。数据加载成功后先用一个基础折线图查看这些鸟的最大翼展wingspan birds[MaxWingspan] wingspan.plot()一眼就能发现问题图中存在至少一个极端异常值——翼展 2300 厘米即 23 米相当于明尼苏达有翼手龙出没。虽然用 Excel 快速排序也能找出这类疑似录入错误的离群点但本课选择直接在绘图流程内继续排查这正是数据可视化以图查数的价值。为了让图表可读为 x 轴添加鸟类名称标签plt.title(Max Wingspan in Centimeters) plt.ylabel(Wingspan (CM)) plt.xlabel(Birds) plt.xticks(rotation45) x birds[Name] y birds[MaxWingspan] plt.plot(x, y) plt.show()即使将标签旋转 45 度441 个鸟类名称仍然密密麻麻、难以阅读。课程因此换了一种策略只标注异常值并把标签直接放进图内。散点图能为标签留出更多空间plt.title(Max Wingspan in Centimeters) plt.ylabel(Wingspan (CM)) plt.tick_params(axisboth,whichboth,labelbottomFalse,bottomFalse) for i in range(len(birds)): x birds[Name][i] y birds[MaxWingspan][i] plt.plot(x, y, bo) if birds[MaxWingspan][i] 500: plt.text(x, y * (1 - 0.05), birds[Name][i], fontsize12) plt.show()这段代码的关键点拆解plt.tick_params(axisboth, whichboth, labelbottomFalse, bottomFalse)隐藏底部刻度标签与刻度线plt.plot(x, y, bo)用格式字符串bo将每个点绘制为蓝色实心圆点b blueo 圆点标记遍历数据集对MaxWingspan 500的鸟类用plt.text在点的附近y 轴坐标取y * (1 - 0.05)即略微下移 5% 以避免遮挡写出鸟名。数据过滤剔除翼展录入异常值标注结果指向两个可疑对象**Bald Eagle白头海雕**与Prairie Falcon草原隼。对照 data/birds.csv 实测数据可以确认白头海雕记录的MaxWingspan为 2300、MinWingspan为 1800草原隼的MaxWingspan与MinWingspan均为 1100——这些值比同属猛禽的正常翼展多出一个数量级明显是录入时多敲了一个0。现实中遇到翼展 25 米的白头海雕几乎不可能于是课程演示了如何从绘图中直接过滤这两个异常值plt.title(Max Wingspan in Centimeters) plt.ylabel(Wingspan (CM)) plt.xlabel(Birds) plt.tick_params(axisboth,whichboth,labelbottomFalse,bottomFalse) for i in range(len(birds)): x birds[Name][i] y birds[MaxWingspan][i] if birds[Name][i] not in [Bald eagle, Prairie falcon]: plt.plot(x, y, bo) plt.show()过滤掉异常值后数据变得更加连贯、可理解。这里采用的是绘图时排除的轻量方案在实战中你也可以基于同一逻辑创建新的 DataFrame如birds birds[~birds[Name].isin([Bald eagle, Prairie falcon])]便于后续多次复用干净数据。得到相对干净的翼展数据后就可以进一步思考这个数据集里蕴含的数量问题数据集里有多少种鸟类类别每类各有多少只有多少鸟是灭绝、濒危、稀有或常见状态在林奈分类学中各属Genus、各目Order各有多少成员用柱状图探索鸟类类别数量柱状图适合展示数据的分组情况。课程接下来探索数据集中各类别的鸟类数量找出数量最多的类别。注意后续练习不依赖翼展数值因此前面的两个异常值可以选择继续过滤掉、修正其翼展录入错误或直接保留。若直接从原始数据绘制柱状图birds.plot(xCategory, kindbar, stackedTrue, titleBirds of Minnesota)这份柱状图几乎不可读——未分组的原始数据太多。因此需要先选择要绘制的数据。这里体现的分工是用 Pandas 管理数据分组、计数再交给 Matplotlib 完成绘图。由于类别众多课程把图表改为垂直条形图并拉高画布高度以容纳全部数据category_count birds.value_counts(birds[Category].values, sortTrue) plt.rcParams[figure.figsize] [6, 12] category_count.plot.barh()要点说明birds.value_counts(birds[Category].values, sortTrue)对 Category 列取值做频数统计并按数量降序排序plt.rcParams[figure.figsize] [6, 12]全局设置画布尺寸为 6 × 12 英寸为 40 多个类别留出纵向空间plot.barh()绘制横向horizontal柱状图。这份图直观展示了每个类别的鸟类数量。对照 data/birds.csv 的实测统计数量最多的类别正是Ducks/Geese/Waterfowl45 条其次是 New World warblers41 条、Sandpipers/Allies34 条等。明尼苏达号称万湖之州鸭子/鹅/水鸟数量居首完全符合直觉。你也可以尝试对数据集做其他计数统计如按属、按保护状态观察是否有意外发现。比较数据按类别查看最大体长与叠加区间柱状图还可以通过新建坐标轴实现分组数据的多种比较。先比较不同类别鸟类的最大体长MaxLengthmaxlength birds[MaxLength] plt.barh(ybirds[Category], widthmaxlength) plt.rcParams[figure.figsize] [6, 12] plt.show()这里用plt.barh(y..., width...)直接以类别为 y 轴、最大体长为条形宽度绘图。结果符合生物学常识蜂鸟Hummingbirds的最大体长最短而鹈鹕Pelicans、鹅类Geese的体长最长。数据呈现合理的逻辑性本身也是对数据质量的一种验证。更有趣的玩法是叠加superimpose两组数据例如将最小体长与最大体长叠加在同一个类别轴上minLength birds[MinLength] maxLength birds[MaxLength] category birds[Category] plt.barh(category, maxLength) plt.barh(category, minLength) plt.show()两次plt.barh依次绘制后短条形MinLength叠在长条形MaxLength之上两者之差即该类别体长的变动范围。从图中可以合理推断体型越大的鸟类其体长范围往往也越大——这是本课一个耐人寻味的发现。配套练习作业、挑战与自查本课配备了两套交互式测验课前测验对应第 16 题、课后测验对应第 17 题与一个动手作业课堂作业Linien, Streudiagramme und Balken折线、散点与柱状图——要求深入数据集挖掘某一种鸟的有趣事实并用本课学到的折线图、散点图、柱状图三种图表在 notebook 中讲一个完整故事例如围绕雪雁 Snow Goose 展开。评分标准关注三点注释清晰、叙事完整、图表美观。 挑战鸟类数据集蕴含某一生态系统中不同鸟类的丰富信息。上网寻找其他鸟类相关数据集围绕它们练习绘制图表去发现你之前未曾意识到的鸟类事实。复习与自学本课初步展示了如何用 Matplotlib 可视化数量。可以继续调研其他数据处理与可视化方式例如 Plotly 这类本课程未覆盖的交互式图表库。小结本课围绕数量可视化这一主题走完了从数据加载、图表选型、异常值发现与过滤到折线图、散点图、柱状图及叠加图绘制的完整链路。核心可复用的方法论包括先选对图表类型再动手画图、用标注与过滤让异常值显形、通过分组计数与叠加比较挖掘数据故事。课程中全部代码基于 notebook.ipynb 与 data/birds.csv 运行后续课程分布、比例、关系、有意义可视化将在本课基础上继续扩展你的 Python 可视化工具箱需要参考实现时也可对照课程目录下的 solution 完整版 notebook。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考