下面我将从基础到高级,详细讲解如何使用 Python 和 DataFrame 进行画图。

核心工具
- Pandas: 用于数据处理和分析,其核心是 DataFrame 对象,Pandas 提供了
.plot()方法,可以快速生成基本图表。 - Matplotlib: Python 最基础、最底层的绘图库,Pandas 的绘图功能就是建立在它之上的,当你需要高度自定义图表时,就需要直接使用 Matplotlib。
- Seaborn: 基于 Matplotlib 的高级可视化库,提供了更美观的默认样式和更复杂的统计图表(如热力图、小提琴图等),它能与 Pandas DataFrame 无缝集成。
准备工作:创建示例 DataFrame
我们创建一个示例 DataFrame,后续的画图都将基于这个数据。
import pandas as pd
import numpy as np
# 创建一个示例 DataFrame
data = {
'月份': ['一月', '二月', '三月', '四月', '五月', '六月'],
'产品A销量': [120, 150, 180, 200, 170, 220],
'产品B销量': [90, 110, 140, 130, 160, 190],
'广告费(千元)': [50, 60, 75, 80, 70, 95]
}
df = pd.DataFrame(data)
# 设置 '月份' 列为索引,方便绘图
df.set_index('月份', inplace=True)
print(df)
输出:
产品A销量 产品B销量 广告费(千元)
月份
一月 120 90 50
二月 150 110 60
三月 180 140 75
四月 200 130 80
五月 170 160 70
六月 220 190 95
使用 Pandas 内置的 .plot() 方法
这是最直接、最快速的方式。.plot() 方法非常智能,默认情况下:
- X轴: 使用 DataFrame 的索引。
- Y轴: 使用所有数值列。
a) 折线图
折线图非常适合展示数据随时间或其他连续变量的变化趋势。

# 绘制所有数值列的折线图
df.plot(figsize=(10, 6)) # figsize 可以调整图表大小
和标签
import matplotlib.pyplot as plt'月度产品销量与广告费趋势')
plt.xlabel('月份')
plt.ylabel('数量')
plt.grid(True) # 添加网格线
plt.show()
b) 柱状图
柱状图用于比较不同类别之间的数值。
# 绘制柱状图
df.plot(kind='bar', figsize=(10, 6))
'月度产品销量与广告费对比')
plt.xlabel('月份')
plt.ylabel('数量')
plt.legend(title='项目') # 设置图例标题
plt.xticks(rotation=45) # 旋转X轴标签,防止重叠
plt.grid(axis='y') # 只在Y轴上显示网格线
plt.tight_layout() # 自动调整布局,防止标签被截断
plt.show()
c) 水平柱状图
将柱状图横向放置,当类别名称较长时非常有用。
df.plot(kind='barh', figsize=(10, 7))'月度产品销量与广告费对比 (水平)')
plt.xlabel('数量')
plt.show()
d) 饼图
饼图用于显示每个部分占整体的比例。
注意:饼图通常只适用于展示单个分类变量的占比。

# 提取六月的数据作为示例
june_data = df.loc['六月']
june_data.plot(kind='pie',
autopct='%1.1f%%', # 显示百分比,保留一位小数
startangle=90, # 从90度(正上方)开始绘制
shadow=True, # 添加阴影
explode=(0.1, 0.1, 0.1), # 将扇形突出显示
figsize=(8, 8))
'六月各项指标占比')
plt.ylabel('') # 隐藏Y轴标签
plt.show()
e) 直方图
直方图用于展示单个数值变量的分布情况。
# 查看 '产品A销量' 的分布
df['产品A销量'].plot(kind='hist', bins=5, figsize=(8, 6)) # bins 指定分箱数量
'产品A销量分布')
plt.xlabel('销量区间')
plt.ylabel('频次')
plt.show()
f) 箱线图
箱线图也是用于展示数据分布的,它可以清晰地显示中位数、四分位数和异常值。
# 比较两个产品销量的分布
df[['产品A销量', '产品B销量']].plot(kind='box', figsize=(8, 6))
'产品销量分布箱线图')
plt.ylabel('销量')
plt.show()
更高级的绘图:使用 Seaborn
Seaborn 在绘制统计图表方面更加强大和美观,它的主要优势在于能自动处理 DataFrame 的结构,非常适合进行数据探索。
a) 折线图
Seaborn 的 lineplot 可以轻松绘制多条线,并自动添加置信区间。
import seaborn as sns
import matplotlib.pyplot as plt
# 设置 Seaborn 的风格
sns.set_theme(style="whitegrid")
plt.figure(figsize=(10, 6))
# Seaborn 会自动识别数值列并绘制多条线
sns.lineplot(data=df, markers=True, dashes=False) # markers添加数据点, dashes取消虚线
'Seaborn 月度产品销量与广告费趋势')
plt.xlabel('月份')
plt.ylabel('数量')
plt.show()
b) 柱状图
Seaborn 的 barplot 默认会显示每个柱的置信区间。
# 重置索引,方便 Seaborn 使用 '月份' 作为 X 轴变量
df_reset = df.reset_index()
plt.figure(figsize=(10, 6))
sns.barplot(x='月份', y='产品A销量', data=df_reset)
'Seaborn 月度产品A销量')
plt.xlabel('月份')
plt.ylabel('销量')
plt.show()
c) 散点图 + 回归线
regplot 是一个非常强大的工具,可以同时绘制散点图和线性回归线,非常适合分析两个变量之间的关系。
plt.figure(figsize=(10, 6))
# 分析广告费和产品A销量的关系
sns.regplot(x='广告费(千元)', y='产品A销量', data=df_reset)
'广告费与产品A销量的关系')
plt.xlabel('广告费 (千元)')
plt.ylabel('产品A销量')
plt.show()
d) 热力图
热力图是查看 DataFrame 中各列相关性(corr())的绝佳工具。
# 计算各列之间的相关系数 correlation_matrix = df.corr() plt.figure(figsize=(8, 6)) # annot=True 在格子里显示数值, cmap='coolwarm' 使用冷暖色调 sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', linewidths=.5) '各指标相关性热力图') plt.show()
直接使用 Matplotlib 进行精细控制
当 Pandas 和 Seaborn 无法满足你的个性化需求时,就需要直接调用 Matplotlib,其核心思想是:
- 从 DataFrame 中提取数据(
df['列名'].values或df.index)。 - 使用 Matplotlib 的函数(如
plt.plot(),plt.bar())进行绘图。
import matplotlib.pyplot as plt
# 提取数据
months = df.index
sales_A = df['产品A销量']
sales_B = df['产品B销量']
# 创建图表和坐标轴
fig, ax = plt.subplots(figsize=(12, 7))
# 在同一个坐标轴上绘制多条线
ax.plot(months, sales_A, marker='o', linestyle='-', label='产品A销量')
ax.plot(months, sales_B, marker='s', linestyle='--', label='产品B销量')
# 添加标签、标题和图例
ax.set_title('Matplotlib 绘制的月度产品销量对比', fontsize=16)
ax.set_xlabel('月份', fontsize=12)
ax.set_ylabel('销量', fontsize=12)
ax.legend()
ax.grid(True)
# 自定义X轴刻度
ax.set_xticks(months) # 确保所有月份都显示
plt.show()
总结与建议
| 需求场景 | 推荐工具 | 优点 |
|---|---|---|
| 快速探索性数据分析 | Pandas .plot() |
代码最简洁,一行代码出图,适合快速查看数据趋势。 |
| 绘制统计图表 (回归、分布、热力图等) | Seaborn | 图表美观,统计功能强大,与 DataFrame 结合紧密。 |
| 高度自定义图表样式 | Matplotlib | 灵活性最高,可以控制图表的每一个细节,但代码量也最大。 |
| 创建复杂多子图布局 | Matplotlib plt.subplots() |
可以在一个画布上创建多个独立的子图,非常适合对比分析。 |
工作流建议:
- 初步探索:使用
df.plot()快速画出各种类型的图表,了解数据的基本情况。 - 深入分析:根据初步发现,使用 Seaborn 绘制更专业的统计图表(如回归图、分布图)来验证假设。
- 最终呈现:如果图表需要用于报告或展示,使用 Matplotlib 进行精细调整,使其更美观、信息更清晰。
