Matplotlib 绘图方法大全(附完整代码示例)

Matplotlib 是 Python 最流行的数据可视化库之一,提供了丰富的绘图功能。本文将详细介绍 Matplotlib 的各种主要绘图方法,每种方法都配有完整可执行的代码示例。


1. 基础设置

在开始之前,我们需要先进行基础设置:

import matplotlib.pyplot as plt
import numpy as np

# 设置中文字体显示(解决中文乱码问题)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

# 生成示例数据
x = np.linspace(0, 10, 100)
y = np.sin(x)

这段代码导入了必要的库并生成了示例数据,同时解决了中文显示问题。

2. 折线图 (Line Plot)

折线图是最基本的图表类型之一,用于显示数据随时间或有序类别的变化趋势。

plt.figure(figsize=(8, 5))
plt.plot(x, y, label='正弦曲线', color='blue', linestyle='-', linewidth=2)
plt.title('简单的折线图')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.legend()
plt.grid(True)
plt.show()

这段代码绘制了一条正弦曲线,添加了标题、坐标轴标签和图例。

3. 散点图 (Scatter Plot)

散点图用于展示两个变量之间的关系,适合观察数据的分布情况。

np.random.seed(42)
x_scatter = np.random.rand(50) * 10
y_scatter = np.random.rand(50) * 10
colors = np.random.rand(50)
sizes = 1000 * np.random.rand(50)

plt.figure(figsize=(8, 5))
plt.scatter(x_scatter, y_scatter, c=colors, s=sizes, alpha=0.6, cmap='viridis')
plt.colorbar(label='颜色值')
plt.title('气泡散点图')
plt.xlabel('X值')
plt.ylabel('Y值')
plt.show()

这段代码创建了一个带有颜色和大小变化的散点图,并添加了颜色条。

4. 柱状图 (Bar Chart)

柱状图用于比较不同类别之间的数值大小。

categories = ['苹果', '香蕉', '橙子', '梨', '葡萄']
values = [23, 45, 56, 78, 33]

plt.figure(figsize=(8, 5))
bars = plt.bar(categories, values, color=['red', 'yellow', 'orange', 'green', 'purple'])
plt.title('水果销量柱状图')
plt.xlabel('水果种类')
plt.ylabel('销量(kg)')

# 在柱子上方添加数值标签
for bar in bars:
    height = bar.get_height()
    plt.text(bar.get_x() + bar.get_width()/2., height,
             f'{int(height)}', ha='center', va='bottom')

plt.show()

这段代码创建了一个彩色柱状图,并在每个柱子上方添加了数值标签。

5. 水平柱状图 (Horizontal Bar Chart)

水平柱状图与普通柱状图类似,但柱子是水平排列的。

plt.figure(figsize=(8, 5))
bars = plt.barh(categories, values, color=['red', 'yellow', 'orange', 'green', 'purple'])
plt.title('水果销量水平柱状图')
plt.xlabel('销量(kg)')
plt.ylabel('水果种类')

# 在柱子右侧添加数值标签
for bar in bars:
    width = bar.get_width()
    plt.text(width + 1, bar.get_y() + bar.get_height()/2,
             f'{int(width)}', ha='left', va='center')

plt.show()

这段代码创建了一个水平柱状图,并在每个柱子右侧添加了数值标签。

6. 饼图 (Pie Chart)

饼图用于显示各部分占总体的比例。

plt.figure(figsize=(8, 8))
explode = (0.1, 0, 0, 0, 0)  # 突出显示第一部分
plt.pie(values, labels=categories, explode=explode, autopct='%1.1f%%',
        shadow=True, startangle=90, colors=['red', 'yellow', 'orange', 'green', 'purple'])
plt.title('水果销量占比饼图')
plt.show()

这段代码创建了一个带有百分比标签、阴影效果和突出显示的饼图。

7. 直方图 (Histogram)

直方图用于展示数据的分布情况。

data = np.random.randn(1000)

plt.figure(figsize=(8, 5))
plt.hist(data, bins=30, color='skyblue', edgecolor='black', alpha=0.7)
plt.title('数据分布直方图')
plt.xlabel('数值')
plt.ylabel('频数')
plt.grid(True, axis='y', linestyle='--', alpha=0.7)
plt.show()

这段代码创建了一个显示随机数据分布的直方图。

8. 箱线图 (Box Plot)

箱线图用于显示数据的中位数、四分位数和异常值。

data = [np.random.normal(0, std, 100) for std in range(1, 4)]

plt.figure(figsize=(8, 5))
plt.boxplot(data, patch_artist=True,
            boxprops=dict(facecolor='lightblue', color='blue'),
            whiskerprops=dict(color='black'),
            capprops=dict(color='black'),
            medianprops=dict(color='red'))
plt.title('箱线图示例')
plt.xticks([1, 2, 3], ['组1', '组2', '组3'])
plt.ylabel('数值')
plt.grid(True, axis='y', linestyle='--', alpha=0.7)
plt.show()

这段代码创建了一个彩色箱线图,展示了三组数据的分布情况。

9. 面积图 (Area Plot)

面积图类似于折线图,但线条下方的区域会被填充颜色。

x_area = np.arange(0, 10, 0.1)
y1_area = np.sin(x_area)
y2_area = np.cos(x_area)

plt.figure(figsize=(8, 5))
plt.fill_between(x_area, y1_area, color='skyblue', alpha=0.4, label='正弦')
plt.fill_between(x_area, y2_area, color='orange', alpha=0.4, label='余弦')
plt.plot(x_area, y1_area, color='blue', alpha=0.6, linewidth=1.5)
plt.plot(x_area, y2_area, color='red', alpha=0.6, linewidth=1.5)
plt.title('面积图示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.legend()
plt.grid(True)
plt.show()

这段代码创建了一个包含正弦和余弦曲线的面积图。

10. 等高线图 (Contour Plot)

等高线图用于显示三维数据的二维投影。

 f(x, y):
    return np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)

x_contour = np.linspace(0, 5, 50)
y_contour = np.linspace(0, 5, 40)
X, Y = np.meshgrid(x_contour, y_contour)
Z = f(X, Y)

plt.figure(figsize=(8, 6))
contour = plt.contour(X, Y, Z, 20, colors='black')
plt.clabel(contour, inline=True, fontsize=8)
plt.imshow(Z, extent=[0, 5, 0, 5], origin='lower',
           cmap='RdGy', alpha=0.5)
plt.colorbar(label='Z值')
plt.title('等高线图示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.show()

这段代码创建了一个带有标签的等高线图,并添加了颜色映射。

11. 3D 曲面图 (3D Surface Plot)

Matplotlib 也支持创建三维图形。

from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')

# 创建数据
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
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曲面图')
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_zlabel('Z轴')
plt.show()

这段代码创建了一个彩色的3D曲面图,展示了正弦函数的3D表现。

12. 极坐标图 (Polar Plot)

极坐标图用于展示角度和半径之间的关系。

theta = np.linspace(0, 2 * np.pi, 100)
r = 1 + 0.3 * np.random.randn(100)

plt.figure(figsize=(8, 8))
ax = plt.subplot(111, polar=True)
ax.plot(theta, r, 'o-', color='blue', alpha=0.75)
ax.set_rmax(2)
ax.set_title("极坐标图示例", va='bottom')
plt.show()

这段代码创建了一个极坐标图,展示了随机数据在极坐标下的分布。

13. 热力图 (Heatmap)

热力图用于展示矩阵数据的值,通过颜色变化来反映数值大小。

data = np.random.rand(10, 12)

plt.figure(figsize=(10, 8))
plt.imshow(data, cmap='viridis')
plt.colorbar(label='数值')
plt.title('热力图示例')

# 添加坐标轴标签
plt.xticks(np.arange(12), [f'X{i}' for i in range(1, 13)])
plt.yticks(np.arange(10), [f'Y{i}' for i in range(1, 11)])

# 在每个单元格中显示数值
for i in range(data.shape[0]):
    for j in range(data.shape[1]):
        plt.text(j, i, f'{data[i, j]:.2f}', ha='center', va='center', color='white')

plt.show()

这段代码创建了一个带有数值标签的热力图。

14. 误差条形图 (Error Bar Plot)

误差条形图用于展示数据的不确定性或变化范围。

x_error = np.arange(1, 6)
y_error = [2, 3.5, 4, 5.5, 4.5]
y_err = [0.5, 0.4, 0.6, 0.3, 0.7]

plt.figure(figsize=(8, 5))
plt.errorbar(x_error, y_error, yerr=y_err, fmt='o', color='blue',
             ecolor='red', elinewidth=2, capsize=5, capthick=2)
plt.title('误差条形图示例')
plt.xlabel('实验组')
plt.ylabel('测量值')
plt.xticks(x_error, [f'组{i}' for i in x_error])
plt.grid(True, linestyle='--', alpha=0.7)
plt.show()

这段代码创建了一个带有误差条的图表,展示了测量值及其误差范围。

15. 子图 (Subplots)

Matplotlib 允许在一个图形中创建多个子图。

plt.figure(figsize=(12, 8))

# 第一个子图:折线图
plt.subplot(2, 2, 1)
plt.plot(x, np.sin(x), 'r-')
plt.title('正弦曲线')

# 第二个子图:散点图
plt.subplot(2, 2, 2)
plt.scatter(np.random.rand(50), np.random.rand(50), c=np.random.rand(50))
plt.title('随机散点图')

# 第三个子图:柱状图
plt.subplot(2, 2, 3)
plt.bar(categories, values, color=['red', 'yellow', 'orange', 'green', 'purple'])
plt.title('水果销量')

# 第四个子图:饼图
plt.subplot(2, 2, 4)
plt.pie(values, labels=categories, autopct='%1.1f%%')
plt.title('销量占比')

plt.tight_layout()  # 自动调整子图间距
plt.show()

这段代码在一个图形中创建了四个不同类型的子图。

16. 动画 (Animation)

Matplotlib 还支持创建简单的动画。

from matplotlib.animation import FuncAnimation

fig, ax = plt.subplots(figsize=(8, 5))
x_anim = np.linspace(0, 2*np.pi, 100)
line, = ax.plot(x_anim, np.sin(x_anim), 'b-')

def update(frame):
    line.set_ydata(np.sin(x_anim + frame/10))
    return line,

ani = FuncAnimation(fig, update, frames=100, interval=50, blit=True)
plt.title('正弦波动画')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.grid(True)
plt.show()

这段代码创建了一个正弦波动画,展示了如何使用Matplotlib制作简单动画。

16. 总结

本文介绍了Matplotlib中最常用的16种绘图方法,每种方法都配有完整的可执行代码示例。通过这些示例,你可以快速掌握Matplotlib的核心绘图功能,并根据自己的需求进行调整和扩展。Matplotlib的功能远不止于此,还有更多高级功能和定制选项等待你去探索。

希望这篇博客能帮助你更好地使用Matplotlib进行数据可视化!


研究学习不易,点赞易。
工作生活不易,收藏易,点收藏不迷茫 :)


Logo

更多推荐