Matplotlib核心架构
(示意图:Matplotlib容器层与图像层关系)
一、Matplotlib面向对象绘图核心
1.1 架构分层解析
Matplotlib采用三层对象结构实现精细化绘图控制:
- 容器层:Figure(画布)为顶级容器,Axes(子图)承载具体图表元素
- 辅助层:坐标轴、图例、文本等辅助信息对象
- 图像层:Line2D(线条)、Patch(几何图形)等数据图形对象
1.2 多子图布局技巧
使用`plt.subplots()`批量创建网格化布局:
python
fig, axs = plt.subplots(2, 2, figsize=(12,8)) # 2x2子图网格
axs[0,0].plot(x, np.sin(x)) # 左上子图
axs[1,1].scatter(x, x**2) # 右下子图
plt.tight_layout() # 智能调整间距
二、数学函数可视化实战
2.1 基础函数绘制
通过`np.linspace`生成连续数据绘制函数曲线:
python
x = np.linspace(-np.pi, np.pi, 400)
ax.plot(x, np.sin(x), color='#FF6B6B', label='sin(x)')
ax.plot(x, np.cos(x), 'g--', label='cos(x)') # 虚线样式
2.2 复合函数叠加
在同一坐标系绘制多项式与三角函数对比:
python
ax.plot(x, 0.5*x**3 - 2*x + 1, label='三次多项式')
ax.plot(x, np.tan(x)/10, 'm:', label='tan(x)/10')
ax.set_ylim(-3,3) # 限制Y轴范围
三、六大基础图表类型详解
3.1 折线图(Line Plot)
适用场景:趋势分析、时间序列
代码示例:
import matplotlib.pyplot as plt
import random
#准备x,y数据
x=range(40)
y_shanghai=[random.uniform(15,18)for i in x]
y_beijing=[random.uniform(7,14)for j in x]
#创建画布
plt.figure(figsize=(20,8),dpi=100)
#绘制图像
plt.plot(x,y_shanghai,color='blue',linestyle='-')
plt.plot(x,y_beijing,color='red',linestyle='--')
#修改x,y刻度
#准备x,y刻度说明
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
x_label=["11点{}分".format(i)for i in x]
plt.xticks(x[ : : 5],x_label[::5])
plt.yticks(range(0,40,5))
#添加网格显示
plt.grid(linestyle='--',alpha=0.5)
#添加描述信息
plt.xlabel("时间变化")
plt.ylabel("温度变化")
plt.title("北京、上海11点到12点每分钟的温度变化状况")
#显示图例
plt.show()
3.2 直方图(Histogram)
适用场景:数据分布统计
python
import matplotlib.pyplot as plt
import random
#需求:电影时常分布状况
#1.准备数据
x=range(20)
x_time=[random.uniform(0,100)for i in x]
#2.创建画布
plt.figure(figsize=(20,8),dpi=100)
#3.绘制图像
group_num=int((max(x_time)-min(x_time))/2)
plt.hist(x_time,bins=group_num,facecolor='red',alpha=0.5)
#修改x轴刻度
#添加网格
plt.grid(linestyle='--',alpha=0.5)
#4.显示图像
plt.show()
3.3 柱状图(Bar Chart)
适用场景:分类数据对比
python
import matplotlib.pyplot as plt
#1.数据准备
movie_name=["雷神:诸神黄昏","正义联盟","东方快车谋杀案","寻梦环游记","全球风暴"]
first_day=["32453","68344","7344","28453","6234"]
first_week=["80989","76546","42355","87656","24556"]
#2.准备画布
plt.figure(figsize=(20,8),dpi=100)
#3.绘制图像
plt.bar(range(5),first_day,width=0.2,color=['b','r','g','y','c'],label="首日票房")
plt.bar([0.2,1.2,2.2,3.2,4.2],first_week,width=0.2,color=['b','r','g','y','c'],label="首周票房")
#修改刻度
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
plt.xticks([0.2,1.2,2.2,3.2,4.2],movie_name)
#4.显示图像
plt.show()
3.4 散点图(Scatter Plot)
适用场景:相关性分析、聚类
python
import matplotlib.pyplot as plt
#数据准备
x=[324.42,243.55,234.43,567.34,453.31,123.11,353.76,267.65,367.56,243.62,324.75,243.12]
y=[234.23,234.45,254.32,343.56,342.67,234.56,321.65,245.23,267.45,239.23,278.34,278.56]
#创建画布
plt.figure(figsize=(20,8),dpi=100)
#绘制图像
plt.scatter(x,y)
#显示图像
plt.show()
3.5 饼图(Pie chart)
适用场景:占比分析
python
movie_name=["雷神:诸神黄昏","正义联盟","东方快车谋杀案","寻梦环游记","全球风暴"]
place_count=[68790,45678,99873,54353,56724]
#2.创建画布
plt.figure(figsize=(20,8),dpi=100)
#3.绘制图像
plt.pie(place_count,labels=movie_name)
plt.axis('equal')
#创建网格
plt.grid(linestyle='--',alpha=0.5)
#显示图例
plt.legend()
#显示标题
plt.title("电影播放量")
#4.显示图像
plt.show()
注:数据均为假设
通过plt.lenged()添加图例
通过plt.grid()绘制网格
3.6 数学函数图像
import numpy as np
x = np.linspace(-1,1,100)
y = 2*x*x
#创建画布
plt.figure(figsize=(20,8),dpi=100)
#绘制图像
plt.plot(x,y)
#添加网格显示
plt.grid(linestyle='--',alpha=0.5)
#显示图像
plt.show()
四、样式优化与实用技巧
4.1 全局参数配置
python
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
4.2 动态可视化
在Jupyter中启用交互模式:
python
%matplotlib widget
from matplotlib.animation import FuncAnimation
def animate(i):
line.set_ydata(np.sin(x + i/10))
return line,
ani = FuncAnimation(fig, animate, frames=100, interval=50)
五、常见问题解决方案
1. 中文乱码:通过`font_manager`加载本地字体
2. 图像重叠:`plt.tight_layout()`自动调整布局
3. 坐标轴溢出:`ax.set_xlim()`手动设置边界