查看全课大纲(第 85 / 101 节)
  1. 1.数据分析基本概念
  2. 2.学习数据分析的一般路线
  3. 3.数据分析的流程
  4. 4.数据类型
  5. 5.环境部署(1)
  6. 6.环境部署(2)
  7. 7.课程介绍
  8. 8.TXT文件操作
  9. 9.JSON文件操作
  10. 10.CSV文件操作
  11. 11.Excel文件操作
  12. 12.数据库及SQL常用语法
  13. 13.数据库基本操作
  14. 14.数据库多表连接
  15. 15.实战:欧洲职业足球数据库分析
  16. 16.爬虫简介
  17. 17.URL管理模块
  18. 18.网页下载模块
  19. 19.网页解析模块(1)
  20. 20.网页解析模块(2)
  21. 21.Scrapy简介
  22. 22.Scrapy使用步骤(1)
  23. 23.Scrapy使用步骤(2)
  24. 24.Scrapy使用步骤(3)
  25. 25.Scrapy使用步骤(4)
  26. 26.实战:获取国内城市空气质量指数数据
  27. 27.NumPy和SciPy介绍
  28. 28.多维数组
  29. 29.多维数组操作
  30. 30.NumPy的常用方法
  31. 31.向量化介绍
  32. 32.向量化及通用函数
  33. 33.实战:2016美国大选分析
  34. 34.数据结构-Series
  35. 35.数据结构-DataFrame
  36. 36.数据结构-Index
  37. 37.Series的索引操作
  38. 38.DataFrame的索引操作
  39. 39.索引操作总结
  40. 40.运算与对齐
  41. 41.函数应用操作(1) -- map
  42. 42.函数应用操作 (2) -- apply applymap
  43. 43.文件读写操作
  44. 44.排序操作
  45. 45.数据清洗--处理缺失数据
  46. 46.数据清洗--处理重复数据
  47. 47.数据清洗--替换数据
  48. 48.常用统计方法(1) -- describe quantile
  49. 49.常用统计方法(2) -- sum mean median count
  50. 50.常用统计方法(3) -- max min idxmax idxmin
  51. 51.常用统计方法(4) -- mad var std cumsum
  52. 52.实战:全球食品数据分析
  53. 53.层级索引
  54. 54.分组与聚合介绍
  55. 55.分组操作(1) -- GroupBy对象及常用聚合操作
  56. 56.分组操作(2) -- 自定义分组及聚合操作
  57. 57.透视表介绍
  58. 58.透视表操作
  59. 59.数据规整(1) -- 数据合并concat
  60. 60.数据规整(2) -- 数据连接merge
  61. 61.数据重构(3) -- 数据重构stack unstack
  62. 62.实战:互联网电影资料库分析
  63. 63.探索性数据分析EDA介绍
  64. 64.EDA的目的
  65. 65.EDA常用工具
  66. 66.Matplotlib绘图基本介绍
  67. 67.Matplotlib画布
  68. 68.散点图和柱状图的绘制
  69. 69.直方图的绘制
  70. 70.矩阵绘图
  71. 71.子图的使用
  72. 72.Matplotlib颜色、标记、线型
  73. 73.Matplotlib坐标刻度、标签、图例、标题
  74. 74.Seaborn介绍
  75. 75.数据集分布可视化(1) -- 单变量分布、双变量分布
  76. 76.数据集分布可视化(2) -- 变量关系可视化
  77. 77.类别数据可视化 -- 类别散布图、类别内数据分布、类别内统计图
  78. 78.交互式数据可视化工具Bokeh介绍
  79. 79.Bokeh绘制散点图、柱状图、盒子图、弦图
  80. 80.Bokeh绘制常用图形元素
  81. 81.3D绘图 -- mplot3d
  82. 82.3D曲线可视化
  83. 83.3D散点图可视化
  84. 84.3D柱状图可视化
  85. 85.Pandas绘图
  86. 86.实战:Lending Club借贷数据探索性分析及可视化
  87. 87.机器学习介绍及应用场景
  88. 88.机器学习建模介绍 (1) -- 分类
  89. 89.机器学习建模介绍 (2) -- 回归
  90. 90.机器学习建模介绍 (3) -- 聚类
  91. 91.机器学习分类
  92. 92.机器学习工具scikit-learn
  93. 93.使用scikit-learn的流程
  94. 94.数据集准备及划分
  95. 95.模型选择
  96. 96.数据预处理及特征工程
  97. 97.过拟合与欠拟合
  98. 98.模型调参介绍
  99. 99.模型调参方法
  100. 100.模型测试及评价
  101. 101.实战:通过移动设备行为数据预测性别和年龄

Pandas绘图

约 11 分钟

📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · Python数据分析实战

在数据分析中,可视化是洞察数据、呈现结论的关键环节。Pandas不仅提供了强大的数据处理能力,还内置了便捷的绘图功能,能够让我们在数据框(DataFrame)和序列(Series)上直接调用绘图方法,快速将数据转化为图表。本节课我们将学习如何利用Pandas的.plot()方法,绘制折线图、柱状图、直方图、箱线图、面积图、散点图和饼图等多种常用图表。

💡 核心导读

  • 绘图基础:掌握Series和DataFrame对象的.plot()方法,理解其核心参数x、y和kind。
  • 默认行为:了解折线图在不指定坐标轴时,Pandas如何默认使用索引作为x轴、绘制所有数值列;同时明确散点图必须显式指定 x、y。
  • 图表类型:学习通过kind参数切换折线图、柱状图、直方图、箱线图、面积图、散点图和饼图。
  • 实用技巧:掌握绘制分组/堆叠柱状图、调整饼图标签、设置透明度等美化图表的实用技巧。

绘图基础:plot()方法

Pandas的绘图功能基于Matplotlib,但提供了更简洁的DataFrame/Series接口。无论是Series对象还是DataFrame对象,都可以直接调用.plot()方法进行绘图。

import matplotlib
matplotlib.use('Agg') # 使用无界面后端,确保代码在任何环境可运行
import matplotlib.pyplot as plt
import pandas as pd

# 构造一个简单的示例Series
s = pd.Series([1, 3, 2, 4, 5], index=['a', 'b', 'c', 'd', 'e'])
ax = s.plot() # 默认绘制折线图
ax.set_title('Series折线图示例')
plt.close() # 关闭图形,释放内存

.plot()方法的核心参数包括:

  • x, y: 指定用作横坐标和纵坐标的列名。如果不指定,对于DataFrame,默认使用其行索引(index)作为x轴,并绘制所有数值列。
  • kind: 指定图表类型,如'line'(折线图)、'bar'(柱状图)、'hist'(直方图)等。默认值为'line'。

常用图表绘制实战

我们将使用一个手动构造的小型鸢尾花数据集样本来演示各种图表的绘制。请注意,原课程使用了完整的鸢尾花数据集,这里我们使用一个最小可复现样本来演示相同的技术。

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import pandas as pd

# 1. 构造示例数据:鸢尾花数据集的小样本
data = {
    'sepal_length': [5.1, 4.9, 4.7, 7.0, 6.4, 6.9],
    'sepal_width': [3.5, 3.0, 3.2, 3.2, 3.2, 3.1],
    'petal_length': [1.4, 1.4, 1.3, 4.7, 4.5, 4.9],
    'petal_width': [0.2, 0.2, 0.2, 1.4, 1.5, 1.5],
    'species': ['setosa', 'setosa', 'setosa', 'virginica', 'virginica', 'virginica']
}
iris_sample = pd.DataFrame(data)
print("示例数据:")
print(iris_sample)
print("\n数据类型:")
print(type(iris_sample).__name__)
示例数据:
   sepal_length  sepal_width  petal_length  petal_width    species
0           5.1          3.5           1.4          0.2     setosa
1           4.9          3.0           1.4          0.2     setosa
2           4.7          3.2           1.3          0.2     setosa
3           7.0          3.2           4.7          1.4  virginica
4           6.4          3.2           4.5          1.5  virginica
5           6.9          3.1           4.9          1.5  virginica

数据类型:
DataFrame

折线图 (Line Plot)

折线图是.plot()方法的默认类型。对于DataFrame,如果不指定x和y,它会将索引作为x轴,并将所有数值列绘制为不同的线条。

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import pandas as pd

# 重新构造数据,确保代码块自包含
data = {
    'sepal_length': [5.1, 4.9, 4.7, 7.0, 6.4, 6.9],
    'sepal_width': [3.5, 3.0, 3.2, 3.2, 3.2, 3.1],
    'petal_length': [1.4, 1.4, 1.3, 4.7, 4.5, 4.9],
    'petal_width': [0.2, 0.2, 0.2, 1.4, 1.5, 1.5],
}
iris_numeric = pd.DataFrame(data)

# 绘制折线图
ax = iris_numeric.plot() # kind='line' 是默认值
ax.set_title('鸢尾花特征折线图 (索引为X轴)')
plt.close()

柱状图 (Bar Plot)

柱状图常用于展示分类数据的对比。通过kind='bar'指定。对于多组数据(DataFrame的多列),默认绘制为分组柱状图。若设置stacked=True,则绘制为堆叠柱状图。

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import pandas as pd

# 构造包含分组信息的数据
data = {
    'sepal_length': [5.1, 4.9, 4.7, 7.0, 6.4, 6.9],
    'sepal_width': [3.5, 3.0, 3.2, 3.2, 3.2, 3.1],
    'petal_length': [1.4, 1.4, 1.3, 4.7, 4.5, 4.9],
    'petal_width': [0.2, 0.2, 0.2, 1.4, 1.5, 1.5],
    'species': ['setosa', 'setosa', 'setosa', 'virginica', 'virginica', 'virginica']
}
iris_sample = pd.DataFrame(data)

# 1. 先进行分组统计(按物种计算各特征均值)
grouped_mean = iris_sample.groupby('species').mean(numeric_only=True)
print("按物种分组的特征均值:")
print(grouped_mean)

# 2. 用分组统计结果绘制分组柱状图
ax_bar = grouped_mean.plot(kind='bar', figsize=(8, 5))
ax_bar.set_title('各物种特征均值分组柱状图')
ax_bar.set_xlabel('物种')
ax_bar.set_ylabel('均值')
plt.close()
按物种分组的特征均值:
           sepal_length  sepal_width  petal_length  petal_width
species
setosa         4.900000     3.233333      1.366667     0.200000
virginica      6.766667     3.166667      4.700000     1.466667

代码随后绘制分组柱状图:x 轴为两个物种,每个物种并排 4 根柱子对应 4 个特征均值(grouped_mean.plot(kind='bar') 对 DataFrame 默认按列分组并排)。

直方图与箱线图

  • 直方图 (kind='hist'): 用于展示数值数据的分布。bins参数控制柱子的数量,alpha参数设置透明度,stacked=True可绘制堆叠直方图。
  • 箱线图 (kind='box'): 用于展示数据的最小值、第一四分位数、中位数、第三四分位数和最大值,以及潜在的异常值。
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import pandas as pd

# 构造数据
data = {
    'sepal_length': [5.1, 4.9, 4.7, 7.0, 6.4, 6.9],
    'sepal_width': [3.5, 3.0, 3.2, 3.2, 3.2, 3.1],
    'petal_length': [1.4, 1.4, 1.3, 4.7, 4.5, 4.9],
    'petal_width': [0.2, 0.2, 0.2, 1.4, 1.5, 1.5],
}
iris_numeric = pd.DataFrame(data)

# 绘制堆叠直方图 (设置透明度和柱子数量)
ax = iris_numeric[['sepal_length', 'sepal_width']].plot(kind='hist', bins=5, alpha=0.6, stacked=True)
ax.set_title('花萼长度与宽度的堆叠直方图')
plt.close()

# 绘制箱线图
ax = iris_numeric.plot(kind='box')
ax.set_title('各特征箱线图')
plt.close()

面积图与散点图

  • 面积图 (kind='area'): 与折线图类似,但折线下方区域会被填充颜色,常用于表示累积趋势。alpha参数可调整填充透明度。
  • 散点图 (kind='scatter'): 用于展示两个连续变量之间的关系。绘制散点图时必须明确指定x和y参数,否则Pandas会尝试用索引作为x轴,这通常没有意义。
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import pandas as pd

# 构造数据
data = {
    'sepal_length': [5.1, 4.9, 4.7, 7.0, 6.4, 6.9],
    'sepal_width': [3.5, 3.0, 3.2, 3.2, 3.2, 3.1],
    'species': ['setosa', 'setosa', 'setosa', 'virginica', 'virginica', 'virginica']
}
iris_sample = pd.DataFrame(data)

# 绘制面积图
ax = iris_sample[['sepal_length', 'sepal_width']].plot(kind='area', alpha=0.5)
ax.set_title('花萼长度与宽度面积图')
plt.close()

# 绘制散点图:必须指定x和y
ax = iris_sample.plot(x='sepal_length', y='sepal_width', kind='scatter')
ax.set_title('花萼长度与宽度散点图')
plt.close()

饼图 (Pie Plot)

饼图用于显示各部分占总体的比例。使用kind='pie'绘制。有两个常见问题需要注意:

  1. 图形不是圆形:这是因为画布默认是长方形。通过设置figsize=(6, 6)使画布长宽一致即可。
  2. 标签重叠:可以通过调整labelpad等参数来优化标签位置。
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import pandas as pd

# 构造数据
data = {
    'species': ['setosa', 'setosa', 'setosa', 'virginica', 'virginica', 'virginica', 'versicolor', 'versicolor']
}
iris_sample = pd.DataFrame(data)

# 1. 计算各类别的数量
species_count = iris_sample.groupby('species').size()
species_count.name = 'Count' # 为Series设置名称,避免图例显示为None
print("各类别样本数量:")
print(species_count)
各类别样本数量:
species
setosa        3
versicolor    2
virginica     3
Name: Count, dtype: int64
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import pandas as pd

# 构造数据并计算数量
data = {'species': ['setosa', 'setosa', 'setosa', 'virginica', 'virginica', 'virginica', 'versicolor', 'versicolor']}
iris_sample = pd.DataFrame(data)
species_count = iris_sample.groupby('species').size()
species_count.name = 'Count'

# 2. 绘制饼图
ax = species_count.plot(kind='pie',
                        autopct='%.2f%%', # 显示两位小数的百分比
                        figsize=(6, 6),    # 方形画布,保证圆形
                        title='物种分布饼图')
ax.yaxis.labelpad = 30 # 调整标签位置,避免重叠
plt.close()

📝 动手练一练

  1. 概念辨析:在Pandas中,对一个包含多列数值的DataFrame直接调用.plot()方法,但不指定x和y参数,绘制散点图(kind='scatter')。你认为会发生什么?为什么?
👉 点击查看参考答案

这会导致错误或产生无意义的图形。因为散点图必须明确指定两个数值列分别作为x轴和y轴的数据来源。如果不指定,Pandas会尝试使用默认的索引作为x轴,并将所有数值列作为y轴,这在散点图的语境下是无法绘制的。正确的做法是必须通过x和y参数指明两列,例如:df.plot(x='col1', y='col2', kind='scatter')。

  1. 动手实践:使用上面示例中的iris_sample数据,尝试绘制花瓣长度(petal_length)与花瓣宽度(petal_width)的散点图,并为图形添加一个合适的标题。
👉 点击查看参考答案
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import pandas as pd

# 构造包含花瓣数据的数据
data = {
    'petal_length': [1.4, 1.4, 1.3, 4.7, 4.5, 4.9],
    'petal_width': [0.2, 0.2, 0.2, 1.4, 1.5, 1.5],
    'species': ['setosa', 'setosa', 'setosa', 'virginica', 'virginica', 'virginica']
}
iris_sample = pd.DataFrame(data)

# 绘制散点图
ax = iris_sample.plot(x='petal_length', y='petal_width', kind='scatter', title='花瓣长度与宽度散点图')
plt.close()

执行以上代码,即可得到对应的散点图。从图中可以直观看出,setosa品种的花瓣长度和宽度集中在一个较小的区域,而virginica品种则集中在另一个较大的区域,初步显示了不同物种间的差异。

本章小结

本节我们学习了Pandas内置的绘图功能,这是将数据分析结果快速可视化的利器。我们了解到,基于DataFrame和Series的.plot()方法,通过简单的参数调整,就能生成多种类型的专业图表。

📋 行动清单

  • 尝试绘制:在你自己的DataFrame数据上,分别练习绘制折线图、分组柱状图和散点图,熟悉kind、x、y参数的使用。
  • 解决实际问题:如果你有一份销售数据,尝试按产品类别分组,计算销售额总和,并用堆叠柱状图展示各季度趋势。
  • 美化图表:在绘制饼图时,刻意不设置figsize参数,观察图形形状,然后加上figsize=(6,6),体会其作用。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 本节课件:Pandas绘图
    PDF · 322KB
    下载
  • 全套课件打包(第1-5章)
    ZIP · 12.8MB
    下载
  • 全套课件打包(第6-8章)
    ZIP · 15MB
    下载
  • 实战数据集:AppleStore 应用商城分析
    ZIP · 329KB
    下载
  • 实战数据集:女性服装电商分析
    ZIP · 2.8MB
    下载
  • Python 数据分析环境搭建指南
    PDF · 2MB
    下载
  • Scrapy 安装教程
    PDF · 12.7MB
    下载
  • 附加实战项目:AppleStore 应用商城数据分析
    ZIP · 0.3MB · ipynb + CSV 数据
    下载
  • 附加实战项目:银行电话营销数据分析
    ZIP · 0.4MB · ipynb + CSV 数据
    下载
  • 附加实战项目:女性服装电商评论数据分析
    ZIP · 2.7MB · ipynb + CSV 数据
    下载
  • 附加实战项目:美国化学学会杂志数据分析
    ZIP · 34.2MB · ipynb + SQLite 数据库
    下载