ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Data-Science-For-Beginners 第 09 课实战:用 Matplotlib 对数量(Quantity)做线性图、散点图与柱状图可视化

Data-Science-For-Beginners 第 09 课实战:用 Matplotlib 对数量(Quantity)做线性图、散点图与柱状图可视化 Data-Science-For-Beginners 第 09 课实战用 Matplotlib 对数量Quantity做线性图、散点图与柱状图可视化【免费下载链接】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 仓库第 09 课《Visualizing Quantities》可视化数量展开围绕一份明尼苏达州鸟类数据集 birds.csv完整演示如何用 Python 的 Matplotlib Pandas 组合完成从“读入数据—画线性图—标注坐标轴—定位并过滤异常值—做分组柱状图—叠加对比”的全过程。读完后你将能够独立完成数量类数据的三类核心图表line / scatter / bar绘制、用tick_params、plt.text、rcParams等 API 精细控制坐标轴与标签并掌握“从图中发现异常值、再反向清洗数据”的实战工作流。课程背景为什么用鸟类数据集练“数量可视化”本课程的定位是当你拿到一份数据集需要搞清楚“某个东西到底有多少”时第一任务就是检查它的数值分布。仓库为此提供了一份已清洗过的数据集 birds.csv共 443 条鸟类记录不含表头字段混合了文本与数值字段类型含义Name/ScientificName文本鸟类俗名 / 学名Category/Order/Family/Genus文本分类学层级类群/目/科/属ConservationStatus文本保护状态如 LCMinLength/MaxLength数值体长范围厘米MinBodyMass/MaxBodyMass数值体重范围克MinWingspan/MaxWingspan数值翼展范围厘米Matplotlib 的通用绘图流程可以概括为五步识别 dataframe 中要用的列 → 对数据做必要变换 → 指定 x/y 轴的取值 → 选择图表类型 → 显示图形。本课聚焦最适合表达“数量”的三种图线性图line、散点图scatter、柱状图bar。选图原则直接决定图表能不能讲清故事分析随时间的趋势线性图比较数值大小柱状图、条形图、饼图、散点图展示部分与整体的关系饼图展示数据分布散点图、柱状图展示趋势线性图、条形图展示变量间的关系线性图、散点图、气泡图实操时请先打开本课目录下的 notebook.ipynb 并新建单元格所有代码都在这份 notebook 中运行。读入数据并画出第一张线性图数据文件位于仓库根目录的data文件夹。注意原文档 notebook 中写的../../data/birds.csv是相对于 lesson 文件夹的路径从仓库根目录看数据就在 data/birds.csv若你把 notebook 复制到仓库根目录运行请相应调整为data/birds.csv。import pandas as pd import matplotlib.pyplot as plt birds pd.read_csv(../../data/birds.csv) birds.head()birds.head()输出的前几行对应 data/birds.csv 前几行长这样NameScientificNameCategoryOrderFamilyGenusConservationStatusMinLengthMaxLengthMinBodyMassMaxBodyMassMinWingspanMaxWingspan0Black-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接下来用一条最基础的 Pandas 快捷方法画出最大翼展MaxWingspan的线性图wingspan birds[MaxWingspan] wingspan.plot()Series.plot()是 Pandas 对 Matplotlib 的薄封装以序列的索引为 x 轴、数值为 y 轴画折线。第一眼看图就会立刻发现一个严重异常的“尖峰”某个值接近 2300 厘米——也就是 23 米的翼展明尼苏达难道有翼龙在飞这正是本课要演示的核心工作流不离开图表直接在工作流内部追查异常值。给 x 轴加标签先暴露“标签过载”问题线性图的 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()要点解析plt.xticks(rotation45)把 443 个鸟类名称的刻度标签旋转 45 度缓解横向重叠plt.plot(x, y)中 x 是类别标签序列Pandas SeriesMatplotlib 会把字符串当作类别轴刻度标题、轴名先设置再plt.plot顺序不影响结果但必须与plt.show()在同一个当前 figure 上执行。即便旋转 45 度443 个标签依然密到不可读。这说明当样本过多时试图给每个点都打标签是错误策略——正确做法是换一种图型加“选择性标注”。用散点图 plt.text只标注异常值策略调整为改用散点图腾出标注空间且只给异常值翼展 500 厘米打标签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)同时作用于 x/y 轴的主次刻度whichbothlabelbottomFalse隐藏底部刻度文字、bottomFalse移除底部刻度线彻底腾出标签空间plt.plot(x, y, bo)bo是 Matplotlib 简写格式符blue circle画一个蓝色小圆点即散点if birds[MaxWingspan][i] 500阈值过滤绝大多数鸟类翼展在几十到两百多厘米只有超过 500 才值得标注plt.text(x, y * (1 - 0.05), ...)在该点上方 5% 处向下偏移避免与点重合写入文字标签fontsize12保证标签在密集图中仍可读图中浮在高空的两个标签就是异常值Bald eagle白头海雕与 Prairie falcon草原隼。过滤异常值从“看图”回到“改数据”结合常识判断一只翼展 25 米的白头海雕几乎不可能存在——真实翼展约 2 米出头。回查数据源 data/birds.csv 可以确认这两条记录的数值多写了一个0Bald eagle 的MaxWingspan为 2300正常应为 230Prairie falcon 为 1100正常应为 110。这是典型的录入错误typo型异常值。本课给出的处理方式是先不修改原始数据而是在绘图时用名称白名单把它们排除掉观察过滤后的数据形态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()过滤掉两个异常点后整个分布立刻变得紧凑且可理解——这就是“可视化驱动的数据清洗”图先暴露问题数据再修正问题。后续练习不依赖翼展数值你也可以选择过滤这两条记录、或直接修正 CSV 中的笔误。从分布走向计数用柱状图回答“有多少”线性图与散点图展示的是单个数值的分布而“数量”问题更常问的是分组计数例如有多少个鸟类类别Category各自数量是多少有多少种鸟是灭绝、濒危、罕见还是常见的按林奈分类学各属Genus、各目Order分别有多少柱状图正是回答这类问题的工具。反例直接对全量数据堆叠最直接的写法是把整个 dataframe 丢给 Pandas 的绘图接口birds.plot(xCategory, kindbar, stackedTrue, titleBirds of Minnesota)这张图不可读每个类别下又按 443 条记录堆叠柱子内部毫无意义地拥挤。这个反例本身就是一课柱状图不能对着原始明细数据画必须先做聚合。正例Pandas 聚合 Matplotlib 绘图正确分工是Pandas 负责管理数据分组、计数、排序Matplotlib 只负责画图。统计每个Category出现的次数并按数量排序再把图拉高以适应类别数量category_count birds.value_counts(birds[Category].values, sortTrue) plt.rcParams[figure.figsize] [6, 12] category_count.plot.barh()参数说明value_counts(..., sortTrue)对类别数组计数并降序排列结果是一个索引为类别名、值为计数的 Seriesplt.rcParams[figure.figsize] [6, 12]把画布从默认约 6.4x4.8 英寸改为 6x12 英寸的竖版容纳全部类别plot.barh()横向条形图bar horizontal类别名天然适合横向展示长文本标签。对 data/birds.csv 做分组计数可以验证这一结论全表共 53 个类别其中Ducks/Geese/Waterfowl鸭/雁/水禽以 45 种居首其后是New World warblers41 种、Sandpipers/Allies34 种、Gulls/Terns/Skimmers28 种。一眼就能看出该地区鸟类以水禽为主——明尼苏达号称“万湖之州”完全符合预期。也可以自己换ConservationStatus、Genus、Order等列再做计数看看还有什么意外发现。组间比较新建坐标轴与叠加绘制比较各类别的 MaxLength换一个维度比较每个类别的MaxLength体长上限maxlength birds[MaxLength] plt.barh(ybirds[Category], widthmaxlength) plt.rcParams[figure.figsize] [6, 12] plt.show()注意这里的写法与前例不同直接调用 Matplotlib 的plt.barh用原始明细数据逐条画横条而不是先聚合。结果蜂鸟Hummingbirds的 MaxLength 最小鹈鹕、大雁类最大——数据讲出了一个符合常识的故事。叠加 Min/Max 看区间更进一步的技巧是在同一坐标轴上叠加两次barh把同一类别的最小长度和最大长度画在一起形成区间对比minLength birds[MinLength] maxLength birds[MaxLength] category birds[Category] plt.barh(category, maxLength) plt.barh(category, minLength) plt.show()两次调用共享同一个 figure后画的短条MinLength叠在先画的长条MaxLength之上肉眼看即可读出每个类别的长度区间。从图上可以得出一个稳健结论鸟越大体长区间的绝对跨度也越大——大鸟的 Min/Max 差值明显宽于小鸟。小结与延伸练习本课的完整技能链是pd.read_csv读入混合类型数据head()检查结构Series.plot()快速出图用“反直觉的尖峰”定位异常值plt.xticks(rotation45)处理刻度旋转tick_params隐藏刻度、plt.text做选择性标注用value_counts(sortTrue)聚合 plot.barh()rcParams[figure.figsize]输出可读的分组计数图用两次plt.barh叠加展示区间做组间比较。课后练习对应 assignment.md选一个具体物种例如 Snow goose 雪雁围绕它建一个 notebook综合运用线性图、散点图、柱状图三种图型讲一个完整的数据故事。评分标准看三要素注释是否到位、故事线是否连贯、图表是否美观。延伸阅读本仓库后续课程会继续用同一份鸟类数据集展开分布可视化直方图、密度图与比例可视化饼图、华夫图等主题Matplotlib 官方提供 PDF 版 cheatsheet 可作日常速查若需要交互式图表可自行研究 Plotly 等替代库。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表