目录
- 第一步:安装 Matplotlib
- 第二步:导入库与设置风格
- 第三步:基础绘图流程(以折线图为例)
- 第四步:常用图表类型详解
- 折线图 (
plot) - 散点图 (
scatter) - 柱状图 (
bar,barh) - 直方图 (
hist) - 饼图 (
pie) - 箱线图 (
boxplot)
- 折线图 (
- 第五步:图表自定义(让图表更专业)
- 、标签和图例
- 调整坐标轴范围和刻度
- 添加网格线
- 保存图表
- 第六步:进阶技巧
- 多子图 (
subplot) - 使用
seaborn美化图表 - 3D 绘图简介
- 多子图 (
第一步:安装 Matplotlib
如果你还没有安装 matplotlib,可以通过 pip 在命令行中安装:

pip install matplotlib
为了处理数据,我们通常还会安装 numpy 和 pandas:
pip install numpy pandas
第二步:导入库与设置风格
在 Python 脚本或 Jupyter Notebook 中,首先需要导入 matplotlib 的核心模块 pyplot,通常我们给它一个简短的别名 plt。
import matplotlib.pyplot as plt import numpy as np # 导入 numpy 用于生成示例数据
设置绘图风格:Matplotlib 提供了多种预设风格,可以让你的图表更美观。
# 使用 'seaborn' 风格,这个风格比较现代和美观
plt.style.use('seaborn-v0_8')
# 查看所有可用的风格
# print(plt.style.available)
第三步:基础绘图流程(以折线图为例)
绘制一个图表的基本流程通常包括以下四步:

- 准备数据:创建用于绘图的数据,通常是 NumPy 数组或 Python 列表。
- 创建图表和坐标轴:使用
plt.figure()创建一个图表窗口,plt.axes()或plt.subplots()创建坐标轴。 - 绘图:在坐标轴上调用绘图函数,如
plt.plot()。 - 显示和保存:使用
plt.show()显示图表,或plt.savefig()保存图表。
示例代码:
# 1. 准备数据 x = np.linspace(0, 10, 100) # 从 0 到 10,生成 100 个均匀分布的点 y = np.sin(x) # 计算 x 的正弦值 # 2. 创建图表和坐标轴 (plt.plot 会自动完成这一步,但显式写出有助于理解) # fig, ax = plt.subplots() # 创建一个包含单个坐标轴的图表 # 上面这行代码等同于下面两行 fig = plt.figure() ax = fig.add_subplot(111) # 3. 绘图 # 直接使用 plt.plot 会在当前激活的坐标轴上绘图 plt.plot(x, y, label='sin(x)', color='blue', linestyle='--') # 4. 显示图表 plt.show()
简化版(常用写法):
在实际使用中,plt.plot() 会自动创建图表和坐标轴,所以代码可以简化为:
import matplotlib.pyplot as plt import numpy as np # 1. 准备数据 x = np.linspace(0, 10, 100) y = np.sin(x) # 2. 绘图 (自动创建图表和坐标轴) plt.plot(x, y, label='sin(x)') # 3. 显示图表 plt.show()
第四步:常用图表类型详解
折线图 (plt.plot)
用于展示数据随时间或某个连续变量变化的趋势。

x = np.arange(0, 5, 0.1)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x, y1, label='sin(x)')
plt.plot(x, y2, label='cos(x)', linestyle=':') # 虚线
"Sine and Cosine Waves") # 标题
plt.xlabel("X-axis") # x轴标签
plt.ylabel("Y-axis") # y轴标签
plt.legend() # 显示图例
plt.grid(True) # 显示网格
plt.show()
散点图 (plt.scatter)
用于展示两个变量之间的关系。
# 生成随机数据
np.random.seed(42)
x = np.random.rand(50)
y = np.random.rand(50)
colors = np.random.rand(50)
sizes = 1000 * np.random.rand(50) # 点的大小
plt.scatter(x, y, c=colors, s=sizes, alpha=0.5, cmap='viridis')
plt.colorbar(label='Color Value') # 显示颜色条"Scatter Plot")
plt.xlabel("X values")
plt.ylabel("Y values")
plt.show()
柱状图 (plt.bar, plt.barh)
用于比较不同类别的数据。
categories = ['A', 'B', 'C', 'D']
values = [15, 30, 45, 10]
# 垂直柱状图
plt.bar(categories, values, color=['skyblue', 'salmon', 'lightgreen', 'gold'])"Vertical Bar Chart")
plt.xlabel("Category")
plt.ylabel("Value")
plt.show()
# 水平柱状图
plt.barh(categories, values, color=['skyblue', 'salmon', 'lightgreen', 'gold'])"Horizontal Bar Chart")
plt.xlabel("Value")
plt.ylabel("Category")
plt.show()
直方图 (plt.hist)
用于展示数据的分布情况。
# 生成正态分布数据
data = np.random.randn(1000)
plt.hist(data, bins=30, color='purple', alpha=0.7, edgecolor='black') # bins 是条形的数量"Histogram of a Normal Distribution")
plt.xlabel("Value")
plt.ylabel("Frequency")
plt.show()
饼图 (plt.pie)
用于展示各部分占整体的比例。
sizes = [15, 30, 45, 10]
labels = ['A', 'B', 'C', 'D']
explode = (0, 0.1, 0, 0) # 突出显示第二块
plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
shadow=True, startangle=90)
# autopct 显示百分比
plt.axis('equal') # 保证饼图是圆的"Pie Chart")
plt.show()
箱线图 (plt.boxplot)
用于显示数据的五数概括(最小值、第一四分位数、中位数、第三四分位数、最大值),并识别异常值。
# 生成多组数据
data1 = np.random.normal(100, 10, 200)
data2 = np.random.normal(110, 15, 200)
data3 = np.random.normal(90, 20, 200)
data_to_plot = [data1, data2, data3]
plt.boxplot(data_to_plot, labels=['Group 1', 'Group 2', 'Group 3'])"Boxplot Comparison")
plt.ylabel("Value")
plt.grid(True)
plt.show()
第五步:图表自定义(让图表更专业)
一个专业的图表离不开精细的自定义,以下是最常用的自定义选项:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = x ** 2
# 1. 创建一个更大的图表
plt.figure(figsize=(10, 6)) # 设置图表大小为 10x6 英寸
# 2. 绘制多条线
plt.plot(x, y, label='y = x^2', color='red', linewidth=2, marker='o', markersize=5, linestyle='-')
plt.plot(x, x**2.5, label='y = x^2.5', color='green', linestyle='--')
# 3. 添加标题和标签'Quadratic and Power Functions', fontsize=16, pad=20) # pad 增加标题与图表的距离
plt.xlabel('X Axis', fontsize=12)
plt.ylabel('Y Axis', fontsize=12)
# 4. 设置坐标轴范围
plt.xlim([0, 8]) # x轴范围
plt.ylim([0, 100]) # y轴范围
# 5. 设置刻度
plt.xticks(np.arange(0, 9, 2)) # x轴刻度从0到8,步长为2
plt.yticks(np.arange(0, 101, 20)) # y轴刻度从0到100,步长为20
# 6. 添加网格和图例
plt.grid(True, which='both', linestyle=':', linewidth=0.5) # which='both' 同时显示主次刻度网格
plt.legend(loc='upper left', fontsize=10) # loc 可以是 'best', 'upper right', 'lower left' 等
# 7. 添加文本注释
plt.text(5, 50, 'This is a point of interest', fontsize=12,
bbox=dict(facecolor='yellow', alpha=0.5)) # bbox 添加文本背景框
# 8. 保存图表 (必须在 plt.show() 之前)
plt.savefig('my_custom_plot.png', dpi=300, bbox_inches='tight') # dpi 是分辨率, bbox_inches='tight' 防止标签被裁剪
# 9. 显示图表
plt.show()
第六步:进阶技巧
多子图 (plt.subplots)
使用 plt.subplots() 可以在一个图表窗口中创建多个子图。
fig, axes = plt.subplots(2, 2, figsize=(12, 10)) # 创建一个 2x2 的子图网格
# --- 子图 1 ---
axes[0, 0].plot(x, np.sin(x), 'b-')
axes[0, 0].set_title('Sine Wave')
axes[0, 0].set_xlabel('X')
axes[0, 0].grid(True)
# --- 子图 2 ---
axes[0, 1].plot(x, np.cos(x), 'r--')
axes[0, 1].set_title('Cosine Wave')
axes[0, 1].set_xlabel('X')
# --- 子图 3 (柱状图) ---
categories = ['A', 'B', 'C']
values = [3, 7, 2]
axes[1, 0].bar(categories, values)
axes[1, 0].set_title('Bar Chart')
# --- 子图 4 (散点图) ---
axes[1, 1].scatter(x, np.random.randn(100), alpha=0.5)
axes[1, 1].set_title('Scatter Plot')
# 调整子图间距,防止重叠
plt.tight_layout()
plt.show()
使用 seaborn 美化图表
seaborn 是一个基于 Matplotlib 的高级可视化库,它提供了更美观的默认风格和更简单的复杂图表绘制函数。
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# 使用 seaborn 的风格
sns.set_theme(style="whitegrid")
# 加载一个示例数据集
tips = sns.load_dataset("tips")
# 创建一个更复杂的图表(小提琴图+散点图)
plt.figure(figsize=(8, 6))
sns.violinplot(x="day", y="total_bill", data=tips, inner="quartile")
sns.swarmplot(x="day", y="total_bill", data=tips, color="black", alpha=0.5)
"Total Bill Distribution by Day")
plt.show()
3D 绘图简介
Matplotlib 也支持 3D 绘图,需要从 mpl_toolkits.mplot3d 导入 Axes3D。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d') # 关键:指定 projection='3d'
# 准备数据
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
# 绘制 3D 曲面
surf = ax.plot_surface(X, Y, Z, cmap='viridis', edgecolor='none')
# 添加颜色条
fig.colorbar(surf, shrink=0.5, aspect=5)
ax.set_title("3D Surface Plot")
ax.set_xlabel("X axis")
ax.set_ylabel("Y axis")
ax.set_zlabel("Z axis")
plt.show()
Matplotlib 是 Python 数据可视化的基石,掌握它的基本流程和常用图表类型,你就能将数据转化为清晰、有效的信息,好的图表不仅要准确,还要美观、易于理解,通过不断练习和自定义,你一定能创造出专业的数据可视化作品。
