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()