Python数据可视化速成指南

Day 8:数据可视化【必背版】

📌 今日目标

掌握Matplotlib的基本使用,能够绘制常见图表(柱状图、线图、饼图、散点图等),理解数据可视化的价值!


第一部分:数据可视化的重要性【必考!】

可视化的四大优点

复制代码
优势1:传递速度快
└─ 人脑对视觉信息的处理速度是书面信息的10倍

优势2:数据显示的多维性
└─ 可从多个维度观察数据关系

优势3:更直观的展示信息
└─ 简短的图形体现复杂的信息

优势4:易于理解和记忆
└─ 图文结合比纯文字更容易理解

Matplotlib库

python 复制代码
# Matplotlib:Python中的绘图库
# ✓ 绘制2D和3D数据图表
# ✓ 支持多种坐标系(迪卡尔、极坐标、球坐标等)
# ✓ 图形达到出版级标准
# ✓ 可绘制多个子图

# 安装
# pip install matplotlib

# 导入
import matplotlib.pyplot as plt

第二部分:Matplotlib基础【必背!】

图表的三个层次

复制代码
Matplotlib图表结构
│
├─ 容器层(最底层)
│  ├─ Canvas:画布(系统自动创建)
│  ├─ Figure:绘图区(plt.figure()创建)
│  └─ Axes:坐标系(一个Figure可包含多个Axes)
│
├─ 辅助显示层(中间层)
│  ├─ 标题(title)
│  ├─ 坐标轴(axis)
│  ├─ 刻度(tick)
│  ├─ 刻度标签(tick label)
│  └─ 图例(legend)
│
└─ 图像层(最上层)
   ├─ 柱状图(bar)
   ├─ 折线图(plot)
   ├─ 饼图(pie)
   ├─ 散点图(scatter)
   └─ 直方图(hist)

创建绘图区

python 复制代码
# 方法1:自动创建(简单)
import matplotlib.pyplot as plt
plt.plot([1, 2, 3])  # 自动创建绘图区
plt.show()

# 方法2:手动创建(推荐)
fig, ax = plt.subplots(figsize=(6, 4))  # 6*4英寸
# figsize:(宽, 高),单位英寸
# dpi:分辨率,默认100

# 方法3:figure函数
plt.figure(figsize=(8, 6), dpi=72, facecolor='white')

解决中文显示问题【重要!】

python 复制代码
# 方法1:代码中添加(推荐)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 黑体
plt.rcParams['axes.unicode_minus'] = False     # 显示负号

# 后续代码才会使用中文字体
plt.title("销售统计")  # 可显示中文

# 方法2:修改配置文件
# 找到C:\Users\...\Anaconda3\Lib\site-packages\matplotlib\mpl-data\matplotlibrc
# 修改:
# font.sans-serif : SimHei
# axes.unicode_minus : False

第三部分:绘制线图(plot)【核心!】

plot()函数

python 复制代码
# 语法
plt.plot([x], y, [fmt], **kwargs)

# 参数说明:
# x:x轴数据(可省略,默认为0,1,2,...)
# y:y轴数据(必须)
# fmt:格式字符串(颜色、标记、线型)
# color:颜色
# marker:标记符号
# linestyle(ls):线型
# linewidth(lw):线宽
# label:图例标签

颜色和标记【记忆!】

python 复制代码
# 颜色缩写
'r' - red      红色
'g' - green    绿色
'b' - blue     蓝色
'y' - yellow   黄色
'k' - black    黑色
'w' - white    白色
'c' - cyan     青色
'm' - magenta  洋红色

# 标记符号
'o' - 圆圈      '^' - 上三角形
'D' - 菱形      'v' - 下三角形
's' - 正方形    '<' - 左三角形
'*' - 星号      '>' - 右三角形
'+' - 加号      'x' - X符号
',' - 点        '|' - 竖线

# 线型
'-'  - 实线(默认)
'--' - 长虚线
':'  - 点虚线
'-.' - 点划线
'None' - 不画线

# 格式字符串示例
plt.plot(x, y, 'ro')      # 红色圆点
plt.plot(x, y, 'g--')     # 绿色长虚线
plt.plot(x, y, 'b^:')     # 蓝色上三角点虚线

绘制线图示例【必背】

python 复制代码
import matplotlib.pyplot as plt
import math

plt.rcParams['font.sans-serif'] = ['SimHei']

# 生成数据
x = []
y_sin = []
y_cos = []

t = -math.pi
while t <= math.pi:
    x.append(t)
    y_sin.append(math.sin(t))
    y_cos.append(math.cos(t))
    t += 0.1

# 绘制
plt.figure(figsize=(8, 4))
plt.plot(x, y_sin, label='sin(x)', marker='*', color='b')
plt.plot(x, y_cos, label='cos(x)', marker='D', color='r')

# 设置标签和标题
plt.title('三角函数曲线')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc='upper right')  # 显示图例
plt.grid(True)  # 显示网格
plt.show()

第四部分:绘制柱状图(bar)【重要!】

bar()函数

python 复制代码
# 语法
plt.bar(x, height, width, bottom, **kwargs)

# 参数说明:
# x:分类轴位置
# height:柱形高度(y轴数据)
# width:柱形宽度(默认0.8)
# bottom:柱形底部值(用于堆叠)
# color/facecolor:填充颜色
# label:图例标签
# alpha:透明度(0-1)

单产品柱状图【必背】

python 复制代码
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']

# 数据准备
seasons = ['一季度', '二季度', '三季度', '四季度']
sales = [2780, 1950, 2680, 2120]
x = [0, 1, 2, 3]

# 绘制柱状图
fig, ax = plt.subplots(figsize=(6, 4))
bars = ax.bar(x, sales, width=0.7, color='b', label='销售量')

# 设置标题和标签
ax.set_title('产品销售统计')
ax.set_xlabel('时间')
ax.set_ylabel('销售量')
ax.set_xticks(x)
ax.set_xticklabels(seasons)
ax.grid(axis='y')  # 显示y轴网格

# 添加数值标注
for i, v in enumerate(sales):
    ax.text(i, v + 30, str(v), ha='center', fontsize=10)

# 显示图例
ax.legend(loc='upper right')
plt.show()

多产品柱状图(并列)【必知!】

python 复制代码
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']

# 数据
seasons = ['一季度', '二季度', '三季度', '四季度']
saleA = [780, 950, 680, 550]
saleB = [680, 650, 800, 590]
barW = 0.3

# x坐标位置
x1 = [0, 1, 2, 3]
x2 = [x + barW for x in x1]  # 错开位置

# 绘制两组柱状图
fig, ax = plt.subplots(figsize=(8, 4))
ax.bar(x1, saleA, barW, label='产品A', color='m')
ax.bar(x2, saleB, barW, label='产品B', color='b')

# 设置标签
ax.set_title('多产品销售比较')
ax.set_xlabel('时间')
ax.set_ylabel('销售量')
ax.set_xticks([x + barW/2 for x in x1])  # 标签位置
ax.set_xticklabels(seasons)

# 显示图例
ax.legend(loc='upper right')
plt.show()

第五部分:绘制饼图(pie)【必知!】

pie()函数

python 复制代码
# 语法
plt.pie(data, explode=None, labels=None, autopct=None, **kwargs)

# 参数说明:
# data:数据列表
# explode:裂开距离(元组,对应每个扇形)
# labels:每个扇形的标签
# autopct:百分比格式(如'%1.1f%%')
# colors:颜色列表
# startangle:起始角度

饼图示例【必背】

python 复制代码
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']

# 数据
scores = [0.16, 0.28, 0.32, 0.14, 0.1]  # 各等级百分比
labels = ['优秀', '良好', '中等', '及格', '不及格']
explode = (0.2, 0, 0, 0, 0)  # 突出第一块

# 绘制饼图
fig, ax = plt.subplots(figsize=(6, 4))
ax.pie(scores, explode=explode, labels=labels,
       autopct='%1.1f%%',  # 显示百分比
       startangle=90)

ax.set_title('成绩分布')
plt.show()

# 特殊设置
ax.axis('equal')  # 保证饼图是圆形,不是椭圆

第六部分:绘制散点图(scatter)【重要!】

scatter()函数

python 复制代码
# 语法
plt.scatter(x, y, s=None, c=None, marker=None, **kwargs)

# 参数说明:
# x, y:坐标数据
# s:点的大小(默认36)
# c:点的颜色
# marker:标记形状(如'*'、'o'、'^')
# alpha:透明度
# label:图例标签

散点图示例【必背】

python 复制代码
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimHei']

# 生成随机数据
np.random.seed(42)
x = np.random.randn(50)
y = np.random.randn(50)
colors = np.random.randint(0, 5, 50)

# 绘制散点图
fig, ax = plt.subplots(figsize=(6, 4))
scatter = ax.scatter(x, y, c=colors, s=100, marker='o',
                     cmap='viridis', alpha=0.6)

ax.set_title('数据分布散点图')
ax.set_xlabel('X值')
ax.set_ylabel('Y值')
ax.grid(True)
plt.colorbar(scatter)  # 显示颜色条
plt.show()

第七部分:绘制直方图(hist)【必知!】

hist()函数

python 复制代码
# 语法
plt.hist(x, bins=10, edgecolor='black', **kwargs)

# 参数说明:
# x:数据序列
# bins:条形个数(默认10)
# edgecolor:边框颜色
# alpha:透明度
# color:填充颜色

直方图示例

python 复制代码
import matplotlib.pyplot as plt
import numpy as np

# 生成数据
data = np.random.normal(170, 10, 1000)  # 均值170,标准差10

# 绘制直方图
fig, ax = plt.subplots(figsize=(8, 4))
ax.hist(data, bins=30, color='b', edgecolor='black', alpha=0.7)

ax.set_title('身高分布直方图')
ax.set_xlabel('身高(cm)')
ax.set_ylabel('人数')
ax.grid(axis='y')
plt.show()

第八部分:绘制箱形图(boxplot)【了解!】

boxplot()函数

python 复制代码
# 语法
plt.boxplot(data, labels=None, **kwargs)

# 参数说明:
# data:数据列表
# labels:标签列表
# vert:是否竖直(默认True)

箱形图示例

python 复制代码
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']

# 多组成绩数据
scores1 = [36, 90, 99, 68, 78]
scores2 = [64, 93, 87, 99, 78]
scores3 = [85, 95, 99, 75, 98]

# 绘制箱形图
fig, ax = plt.subplots(figsize=(6, 4))
ax.boxplot([scores1, scores2, scores3],
           labels=['语文', '数学', '英语'])

ax.set_title('学生成绩箱形图')
ax.set_ylabel('成绩')
ax.grid(axis='y')
plt.show()

# 理解箱形图:
# 下边缘:最小值
# 下四分位:第25%位置
# 中线:中位数(第50%)
# 上四分位:第75%位置
# 上边缘:最大值

第九部分:子图与图表组合【必知!】

subplot创建子图

python 复制代码
# 语法
plt.subplot(nrows, ncols, index)
# 或简写为:plt.subplot(nrc) 当nrows、ncols、index都<10时

# 参数说明:
# nrows:行数
# ncols:列数
# index:子图位置(从1开始)

子图示例【必背】

python 复制代码
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimHei']

# 创建2x2的子图
fig = plt.figure(figsize=(10, 8))

# 子图1:线图
ax1 = plt.subplot(2, 2, 1)
x = np.linspace(0, 2*np.pi, 100)
ax1.plot(x, np.sin(x), 'b-')
ax1.set_title('sin(x)')

# 子图2:余弦曲线
ax2 = plt.subplot(2, 2, 2)
ax2.plot(x, np.cos(x), 'r-')
ax2.set_title('cos(x)')

# 子图3:散点图
ax3 = plt.subplot(2, 2, 3)
ax3.scatter(np.random.randn(50), np.random.randn(50))
ax3.set_title('散点图')

# 子图4:柱状图
ax4 = plt.subplot(2, 2, 4)
ax4.bar([1, 2, 3], [10, 20, 15])
ax4.set_title('柱状图')

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

subplots创建多个坐标系

python 复制代码
import matplotlib.pyplot as plt

# 创建2行1列的子图
fig, axes = plt.subplots(2, 1, figsize=(6, 6))

# 在第1个坐标系绘制
axes[0].plot([1, 2, 3], [1, 2, 3])
axes[0].set_title('图1')

# 在第2个坐标系绘制
axes[1].plot([1, 2, 3], [3, 2, 1])
axes[1].set_title('图2')

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

第十部分:坐标轴与标签设置【重要!】

常用设置函数

python 复制代码
# 设置标题
plt.title("标题名称", fontsize=14, loc='center')

# 设置轴标签
plt.xlabel("X轴标签")
plt.ylabel("Y轴标签")

# 设置刻度范围
plt.xlim(xmin, xmax)
plt.ylim(ymin, ymax)

# 设置刻度标签
plt.xticks(位置列表, 标签列表)
plt.yticks(位置列表, 标签列表)

# 显示/隐藏网格
plt.grid(True)  # 显示网格
plt.grid(False) # 隐藏网格
plt.grid(axis='y')  # 仅显示y轴网格

# 显示图例
plt.legend(loc='upper right')

图例位置代码

位置 代码
右上 'upper right' 或 1
左上 'upper left' 或 2
左下 'lower left' 或 3
右下 'lower right' 或 4
右边 'right' 或 5
中左 'center left' 或 6
中右 'center right' 或 7
下中 'lower center' 或 8
上中 'upper center' 或 9
中心 'center' 或 10

📝 Day 8 综合作业

作业1:绘制基础图表(必做)

python 复制代码
# 1. 绘制销售数据的柱状图(参考Day 6第一部分)
# 2. 绘制不同产品销售对比(多产品柱状图)
# 3. 绘制成绩分布饼图
# 4. 绘制身高数据直方图

作业2:线图和散点图(必做)

python 复制代码
# 1. 绘制sin和cos函数曲线(参考第三部分)
# 2. 绘制GDP趋势线图(读取文件数据)
# 3. 绘制鸢尾花数据散点图(分类显示)

作业3:多图组合(必做)

python 复制代码
# 1. 创建2x2的子图,分别绘制不同图表
# 2. 在多个子图中绘制GDP产值和增长率
# 3. 调整图表样式和布局

⚡ 考前重点速记

必背代码模板

python 复制代码
# 1. 基本绘图步骤
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']

# 数据准备
x = [1, 2, 3, 4]
y = [10, 20, 15, 25]

# 创建绘图区
fig, ax = plt.subplots(figsize=(6, 4))

# 绘制图表
ax.plot(x, y, 'b-o', label='数据')

# 设置标签
ax.set_title('标题')
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.legend()
ax.grid(True)

plt.show()

# 2. 柱状图
ax.bar(x, height, width=0.7, label='类别')

# 3. 饼图
ax.pie(data, labels=labels, autopct='%1.1f%%')

# 4. 散点图
ax.scatter(x, y, c='r', marker='o', s=50)

# 5. 子图
fig, axes = plt.subplots(2, 2)
axes[0, 0].plot(...)  # 第1行第1列
axes[0, 1].bar(...)   # 第1行第2列
axes[1, 0].scatter(...) # 第2行第1列
axes[1, 1].pie(...)   # 第2行第2列

关键知识点

python 复制代码
# 1. 必须导入并设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']

# 2. 常见图表函数
plot()    # 线图
bar()     # 柱状图
pie()     # 饼图
scatter() # 散点图
hist()    # 直方图

# 3. 标签设置
title()   # 标题
xlabel()  # x轴标签
ylabel()  # y轴标签
xticks()  # x轴刻度

# 4. 样式设置
color: 颜色缩写(r, g, b, y等)
marker: 标记(o, *, D, ^等)
linestyle: 线型(-, --, :, -.)

# 5. 展示方式
plt.show()  # 显示图表
plt.savefig('图片.png')  # 保存图表

易错点提醒

python 复制代码
# ❌ 错误1:中文显示乱码
plt.title("销售统计")  # 会乱码

# ✅ 改正:
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.title("销售统计")

# ❌ 错误2:x和y数据长度不匹配
x = [1, 2, 3]
y = [10, 20]  # 长度不同
plt.plot(x, y)  # 报错

# ✅ 改正:
x = [1, 2, 3]
y = [10, 20, 30]

# ❌ 错误3:忘记显示
plt.plot(x, y)
# 没有plt.show(),看不到图表

# ✅ 改正:
plt.plot(x, y)
plt.show()

# ❌ 错误4:柱状图位置设置错误(多产品)
x1 = [0, 1, 2]
x2 = [0, 1, 2]  # 位置重合
plt.bar(x1, y1)
plt.bar(x2, y2)

# ✅ 改正:
x1 = [0, 1, 2]
x2 = [0.3, 1.3, 2.3]  # 错开
plt.bar(x1, y1, width=0.3)
plt.bar(x2, y2, width=0.3)

🎯 考试可能出现的题型

选择题考点

  • Matplotlib的图表类型
  • 参数的含义(color、marker、linestyle)
  • 中文显示的解决方法
  • 图例和标签的设置

填空题考点

  • 常见参数的英文单词
  • 颜色和标记符号的代码
  • 函数调用的语法

编程题考点

  • 绘制指定类型的图表
  • 多个数据的对比展示
  • 子图的创建和使用
  • 读取数据后绘制图表

调试题考点

  • 中文乱码问题
  • 数据长度不匹配
  • 图例位置设置错误
  • 子图布局问题

🌟 其他常用图表简介

极坐标图

python 复制代码
# 极坐标:使用(角度, 半径)表示点
import numpy as np

theta = np.linspace(0, 2*np.pi, 100)
r = np.sin(4*theta)

ax = plt.subplot(111, projection='polar')
ax.plot(theta, r, 'b-')
plt.show()

3D曲面图

python 复制代码
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

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

X = np.arange(-5, 5, 0.1)
Y = np.arange(-5, 5, 0.1)
X, Y = np.meshgrid(X, Y)
Z = np.sin(np.sqrt(X**2 + Y**2))

ax.plot_surface(X, Y, Z, cmap='viridis')
plt.show()

等高线图

python 复制代码
import numpy as np

X = np.arange(-5, 5, 0.1)
Y = np.arange(-5, 5, 0.1)
X, Y = np.meshgrid(X, Y)
Z = np.sin(np.sqrt(X**2 + Y**2))

# 绘制等高线
plt.contour(X, Y, Z, levels=10)
plt.colorbar()
plt.show()

相关推荐
Larry_Yanan3 小时前
Qt多进程(三)QLocalSocket
开发语言·c++·qt·ui
醒过来摸鱼3 小时前
Java classloader
java·开发语言·python
superman超哥3 小时前
仓颉语言中元组的使用:深度剖析与工程实践
c语言·开发语言·c++·python·仓颉
小鸡吃米…3 小时前
Python - 继承
开发语言·python
JIngJaneIL4 小时前
基于java+ vue农产投入线上管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
祁思妙想4 小时前
Python中的FastAPI框架的设计特点和性能优势
开发语言·python·fastapi
唐装鼠4 小时前
rust自动调用Deref(deepseek)
开发语言·算法·rust
Dingdangcat864 小时前
反恐精英角色识别与定位-基于改进的boxinst_r101_fpn_ms-90k_coco模型实现
python
Lucas555555554 小时前
现代C++四十不惑:AI时代系统软件的基石与新征程
开发语言·c++·人工智能
源代码•宸4 小时前
goframe框架签到系统项目(BITFIELD 命令详解、Redis Key 设计、goframe 框架教程、安装MySQL)
开发语言·数据库·经验分享·redis·后端·mysql·golang