首页 / Pandas 入门教程 / 数据可视化:绘图基础

Pandas 入门教程

数据可视化:绘图基础

本教程共 54 篇 · 第 51 篇 · 更新于 2026-08-11 · 约 6 分钟阅读

PandasPandas 入门教程数据可视化matplotlibplot

本节目标:会用 Series 和 DataFrame 的 plot 方法画出线图、柱状图,理解 pandas 绘图与 matplotlib 的关系,并学会保存图片。

一张图的前世今生

pandas 的绘图是 matplotlib 的”快捷方式”。matplotlib 是 Python 最基础的绘图库,pandas 的 .plot 方法把它包装成了两三行代码。所以画图前先导入 matplotlib:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

Jupyter 里想直接显示图片,加一行魔法命令 %matplotlib inline(新版 Jupyter 默认已经内联)。脚本环境里要用 plt.show() 才会弹出窗口。

理解一个概念就够:一张图由 Figure(画布)和 Axes(坐标系)组成。pandas 的 plot 方法自动创建画布和坐标系,返回的 Axes 对象可以继续加工。plt.show() 显示,plt.savefig() 保存,职责分明。

线图:Series.plot()

Series.plot() 画折线图,索引自动成为 x 轴:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 生成 30 天销售额(累计和,模拟增长趋势)
s = pd.Series(np.random.randn(30).cumsum() + 100,
              index=pd.date_range("2024-01-01", periods=30))
s.plot()
plt.show()

索引是日期时,pandas 自动把 x 轴刻度排得整齐(自动格式化日期),趋势一眼可见。

多列:DataFrame.plot()

DataFrame.plot() 把所有数值列画在一起,图例自动标出列名:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.DataFrame(np.random.randn(100, 3).cumsum(axis=0),
                  columns=["A", "B", "C"])
df.plot()
plt.show()

想指定哪两列对应 x 和 y,用 xy 参数:df.plot(x="A", y="B"),适合”横轴是某个业务指标、纵轴是另一个”的场景。

几条线想叠在同一张图上,逐列调用再统一显示即可:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.DataFrame(np.random.randn(100, 2), columns=["A", "B"])
df["A"].plot(label="A")
df["B"].plot(label="B")
plt.legend()
plt.show()

柱状图:plot.bar()

柱状图适合”分类 vs 数值”:每个分类一根柱子。用 kind 参数或直接调方法都行,推荐方法名,写起来更顺:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({"苹果": [30, 45, 38], "香蕉": [22, 18, 27]},
                  index=["一月", "二月", "三月"])
df.plot.bar()               # 每组两根柱子
plt.show()

df.plot.bar(stacked=True)   # 堆叠:一根柱子是总量
plt.show()

plot.barh() 是横着的柱状图,类别名太长时更好用。plot 的所有 kind 都只是”换个底层 matplotlib 函数”:bar 调 ax.bar()、scatter 调 ax.scatter(),所以 matplotlib 的参数大多能直接透传,比如 df.plot.bar(color="orange")

Note

kind 参数与方法的对应:kind="line" 就是 plot.line()"bar" 就是 plot.bar(),其他还有 "hist""box""scatter""area""pie""kde"。在编辑器里敲 df.plot. 加 Tab,能直接列出所有可用方法。

什么数据配什么图

选图先想清楚要回答什么问题,再选类型:

你想看什么用哪种图方法
随时间的变化趋势线图plot()
分类之间的对比柱状图plot.bar()
单个数值的分布直方图plot.hist()
多列分布对比、找离群点箱线图plot.box()
两个数值列的关系散点图plot.scatter()
总量变化及构成面积图plot.area()
占比饼图plot.pie()

最常见的选错:柱状图和线图分不清。柱状图的 x 轴是分类(哪个产品、哪个月份),线图的 x 轴是连续值(时间、数值区间)。类别之间没有先后关系还硬连成线,会画出误导人的趋势。下一节逐个展开这些图的具体用法。

标题、标签与网格

plot 方法支持常见的修饰参数,直接写在调用里:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

s = pd.Series(np.random.randn(50).cumsum())
s.plot(title="走势图", ylabel="数值", grid=True, legend=False)
plt.show()

title 设标题,xlabel / ylabel 设轴标签,grid=True 加网格线,legend=False 关图例。轴刻度、字体大小这类更细的控制,用返回的 Axes 对象调 matplotlib 方法。

保存图片

plt.show() 显示窗口,plt.savefig() 存文件。顺序上先 savefig 再 show,否则可能存到空白图:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

s = pd.Series(np.random.randn(50).cumsum())
s.plot(title="走势图", ylabel="数值")
plt.savefig("trend.png", dpi=150, bbox_inches="tight")
plt.show()

dpi 控制清晰度,150 以上适合放进文档;bbox_inches="tight" 裁掉多余留白。保存步骤小结:画出图 → 调 savefig 存文件 → show 显示。

中文乱码是新手第一大坑:matplotlib 默认字体不含中文。提前设好:

import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"] = ["SimHei"]  # 黑体
plt.rcParams["axes.unicode_minus"] = False    # 负号正常显示
Warning

中文乱码不要逐个图去改,把上面两行放到脚本开头统一设置。Linux/Mac 没有 SimHei 时,改成系统中文字体名(如 “Noto Sans CJK SC”),或把 ["SimHei"] 换成你系统里存在的字体。

缺失值怎么办

pandas 绘图对 NaN 有默认策略:线图留缺口、柱图和面积图按 0 填充、散点图直接丢弃。想完全掌控,先 dropna()fillna() 再画。数据里有缺失时,提前想清楚”这个空该算 0 还是该断开”,比事后解释图形要省事。

小结

pandas 绘图三板斧:Series.plot() 画单列、DataFrame.plot() 画多列、plot.bar() 画分类柱状图。它本质是 matplotlib 的封装,记住”pandas 出图、matplotlib 收尾(保存、样式)“就够用了。选图口诀:趋势线图、对比柱图、分布直方图、关系散点图。下一节上难度:直方图、箱线图、散点图、子图布局这些进阶图形。