4.1 可视化介绍
为什么要进行数据可视化?
错误案例举例:
4.2 Matplotlib可视化
4.2.1 Matplotlib简介
什么是Matplotlib
Matplotlib是一个Python绘图库,广泛用于创建各种类型的静态、动态和交互式图表。它是数据科学、机器学习、工程和科学计算领域中常用的绘图工具之一。
不同开发环境下显示图形
4.2.2 两种画图接口
Matplotlib有两种画图接口:一个是便捷的MATLAB风格的有状态的接口,另一个是功能更强大的面向对象接口。
状态接口
折线图
|
条形图(Bar Chart)
适用场景:
完整代码:
Python
import matplotlib.pyplot as plt
# 类别与对应数值
subjects = ['语文', '数学', '英语', '科学']
scores = [85, 92, 78, 88]
# 创建条形图
plt.figure(figsize=(8, 5))
plt.bar(subjects, scores, color='skyblue', width=0.6)
# 添加图表元素
plt.title("学生各科成绩对比", fontsize=14)
plt.xlabel("科目")
plt.ylabel("分数")
plt.ylim(0, 100) # 设置y轴范围
plt.grid(axis='y', linestyle='--', alpha=0.6)
# 为每个柱形添加数值标签
for i, score in enumerate(scores):
plt.text(i, score + 1, str(score), ha='center', fontsize=10)
plt.tight_layout()
plt.show()
Python
plt.barh(month,sales,
label='AI眼镜',
color='orange',
)
# 长标签场景(条形图更合适)
countries = ['United States', 'China', 'Japan', 'Germany', 'India']
gdp = [25, 18, 5, 4, 3]
plt.barh(countries, gdp, color='lightgreen')
plt.title('各国GDP对比(单位:万亿美元)')
# plt.tight_layout() # 自动调整标签间距
plt.show()
饼图(Pie Chart)
适用场景:
完整代码:
Python
import matplotlib.pyplot as plt
labels = ['学习', '娱乐', '运动', '睡觉']
time_spent = [4, 2, 1, 8]
# 创建饼图
plt.figure(figsize=(6, 6))
plt.pie(time_spent,
labels=labels,
autopct='%.1f%%', # 显示百分比
startangle=90, # 起始角度
colors=['#66b3ff','#99ff99','#ffcc99','#ff9999'])
plt.title("一天的时间分配", fontsize=14)
plt.show()
环形图
Python
import matplotlib.pyplot as plt
# 数据
labels = ['学习', '娱乐', '运动', '睡觉']
time_spent = [4, 2, 1, 8]
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99']
# 绘制环形图
plt.figure(figsize=(8, 6))
plt.pie(time_spent, labels=labels, colors=colors,
wedgeprops={'width': 0.5}, # 控制环的宽度(0.3~0.7)
autopct='%.1f%%', pctdistance=0.85) # pctdistance调整百分比位置
plt.title('环形图', fontsize=15)
# 在中心添加文字
plt.text(0, 0, "总计\n100%", ha='center', va='center', fontsize=12)
plt.show()
爆炸式饼图
Python
import matplotlib.pyplot as plt
# 数据
labels = ['学习', '娱乐', '运动', '睡觉']
time_spent = [4, 2, 1, 8]
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99']
explode = (0.1, 0, 0, 0) # 仅突出第一块
# 绘制爆炸式饼图
plt.figure(figsize=(6, 6))
plt.pie(time_spent, explode=explode, labels=labels, colors=colors,
autopct='%.1f%%', shadow=True, startangle=90)
plt.title('爆炸式饼图', fontsize=15)
plt.show()
散点图(Scatter Plot)
适用场景:
完整代码:
Python
import matplotlib.pyplot as plt
# 模拟数据:学习时间与成绩
study_hours = [1, 2, 3, 4, 5, 6, 7]
scores = [50, 55, 65, 70, 78, 85, 90]
plt.figure(figsize=(7, 5))
plt.scatter(study_hours, scores, color='green', s=60)
plt.title("学习时间与成绩的关系")
plt.xlabel("每天学习小时数")
plt.ylabel("成绩")
plt.grid(True)
# 添加数据点注释(可选)
for i in range(len(study_hours)):
plt.text(study_hours[i]+0.1, scores[i], f"{scores[i]}", fontsize=9)
plt.show()
Python
import matplotlib.pyplot as plt
import random # 仅用Python内置库生成随机数
# 1. 生成1000个随机点(模拟正相关数据)
random.seed(42)
x = [random.uniform(0, 10) for _ in range(1000)] # X值:0~10均匀分布
y = [xi * 2 + random.gauss(0, 2) for xi in x] # Y值:2倍X值 + 高斯噪声
# 2. 绘制散点图
plt.figure(figsize=(10, 6))
plt.scatter(
x, # X轴坐标数据
y, # Y轴坐标数据
color='blue', # 点的填充颜色为蓝色
alpha=0.5, # 透明度为50%(半透明)
s=20, # 点的大小为20平方磅
edgecolors='none', # 点边缘无颜色(无边框)
label='数据点' # 图例中显示的标签文本
)
#绘制回归线
plt.plot([0, 10],
[0,20],
color='red', linestyle='--', linewidth=2,
label=f'回归线: y = {slope:.2f}x + {intercept:.2f}')
# 4. 美化图表
plt.title('1000个随机点的散点图', fontsize=14)
plt.xlabel('X轴:自变量', fontsize=12)
plt.ylabel('Y轴:因变量', fontsize=12)
plt.grid(True, linestyle='--', alpha=0.3)
plt.legend()
plt.tight_layout()
plt.show()
箱线图(Boxplot)
适用场景:
完整代码:
Python
import matplotlib.pyplot as plt
# 模拟 3 门课的成绩
data = {
'语文': [82, 85, 88, 70, 90, 76, 84, 83, 95],
'数学': [75, 80, 79, 93, 88, 82, 87, 89, 92],
'英语': [70, 72, 68, 65, 78, 80, 85, 90, 95]
}
plt.figure(figsize=(8, 6))
plt.boxplot(data.values(), labels=data.keys())
plt.title("各科成绩分布(箱线图)")
plt.ylabel("分数")
plt.grid(True, axis='y', linestyle='--', alpha=0.5)
plt.show()
面向对象接口
多个图表的绘制
Python
import numpy as np
import matplotlib.pyplot as plt # 导入matplotlib
month = ['1月','2月','3月','4月']
sales = [100,150,80,130]
fig, ax = plt.subplots(2,2, figsize=(10, 10)) # 创建画布,并指定画布大小
# 绘制柱状图
ax[0][0].bar(month,sales,
label='AI眼镜0',
color='orange',
width=0.6,)
ax[0][1].plot(month,sales,
label='AI眼镜1',
color='orange',
)
ax[1][0].bar(month,sales,
label='AI眼镜2',
color='orange',
width=0.6,)
ax[1][1].bar(month,sales,
label='AI眼镜3',
color='orange',
width=0.6,)
# 添加标题
ax[0][0].set_title("2025年销售趋势",fontsize=16,color='red')
ax[1][0].set_title("2025年销售趋势",fontsize=16,color='red')
# 添加坐标轴的标签
ax[0][0].set_xlabel('月份',fontsize=12)
ax[0][0].set_ylabel('销售额(万元)',fontsize=12)
# 添加图例
ax[0][0].legend(loc='upper left')
# 添加网格线
ax[0][0].grid(True,alpha=0.1,color='blue',linestyle='--')
# grid(axis='x' axis='y'
# 自定义y轴范围
ax[0][0].set_ylim(0,200)
plt.show()