杰瑞科技汇

Python如何用matplotlib实现数据可视化?

目录

  1. 第一步:安装 Matplotlib
  2. 第二步:导入库与设置风格
  3. 第三步:基础绘图流程(以折线图为例)
  4. 第四步:常用图表类型详解
    • 折线图 (plot)
    • 散点图 (scatter)
    • 柱状图 (bar, barh)
    • 直方图 (hist)
    • 饼图 (pie)
    • 箱线图 (boxplot)
  5. 第五步:图表自定义(让图表更专业)
    • 、标签和图例
    • 调整坐标轴范围和刻度
    • 添加网格线
    • 保存图表
  6. 第六步:进阶技巧
    • 多子图 (subplot)
    • 使用 seaborn 美化图表
    • 3D 绘图简介

第一步:安装 Matplotlib

如果你还没有安装 matplotlib,可以通过 pip 在命令行中安装:

Python如何用matplotlib实现数据可视化?-图1
(图片来源网络,侵删)
pip install matplotlib

为了处理数据,我们通常还会安装 numpypandas

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)

第三步:基础绘图流程(以折线图为例)

绘制一个图表的基本流程通常包括以下四步:

Python如何用matplotlib实现数据可视化?-图2
(图片来源网络,侵删)
  1. 准备数据:创建用于绘图的数据,通常是 NumPy 数组或 Python 列表。
  2. 创建图表和坐标轴:使用 plt.figure() 创建一个图表窗口,plt.axes()plt.subplots() 创建坐标轴。
  3. 绘图:在坐标轴上调用绘图函数,如 plt.plot()
  4. 显示和保存:使用 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)

用于展示数据随时间或某个连续变量变化的趋势。

Python如何用matplotlib实现数据可视化?-图3
(图片来源网络,侵删)
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 数据可视化的基石,掌握它的基本流程和常用图表类型,你就能将数据转化为清晰、有效的信息,好的图表不仅要准确,还要美观、易于理解,通过不断练习和自定义,你一定能创造出专业的数据可视化作品。

分享:
扫描分享到社交APP
上一篇
下一篇