Matplotlib是专门用于开发2D图表(包括3D图表);以渐进、交互式方式实现数据可视化。
入门案例------绘制一周的温度折线图
python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
* 创建画布
* 参1:画布大小(长,宽) 参2:dpi(像素密度)
plt.figure(figsize=(10,5),dpi=80)
* 准备数据(x轴, y轴)
plt.plot([1,2,3,4,5,6,7],[21,35,12,21,34,33,22])
* 具体绘图
plt.show()
完善原始折线图

1. 准备数据并绘制初始折线图
导包
python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.lines import lineStyles
from pyparsing import alphas
# 解决中文无法显示的问题(Windows)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
绘图
python
# 1.准备x轴(60分钟)和 y轴(每分钟的温度)的数据.
x = range(60)
y = [np.random.uniform(15,18) for i in x]
# 创建画布
# 参1:画布大小(长,宽) 参2:dpi(像素密度)
plt.figure(figsize=(10,5),dpi=80)
# 具体绘图
plt.show()
运行结果:

2. 添加x,y轴的刻度信息,以及网格线
python
# 1.准备x轴(60分钟)和 y轴(每分钟的温度)的数据.
x = range(60)
y = [np.random.uniform(15,18) for i in x]
print(y)
# 创建画布
# 参1:画布大小(长,宽) 参2:dpi(像素密度)
plt.figure(figsize=(10,5),dpi=80)
# 准备数据(x轴, y轴)
plt.plot(x,y,color = 'red') # color可以选择折线颜色
# 设置x,y轴的标签
# 准备x,y轴的刻度信息
x_ticks_lable = [f'11点{i}分' for i in x]
y_ticks = range(40)
# 具体的添加x轴,y轴刻度信息的动作
plt.xticks(x[::5],x_ticks_lable[::5]) # 参1:x轴刻度值 参2:x轴刻度值对应的标签
plt.yticks(y_ticks[::5])
# 添加网格
# 参1:网格线的样式 参2:网格线的透明度
plt.grid(linestyle='--',alpha=0.5)
# 具体绘图
plt.show()
运行结果:

plt.xticks(x,**kwargs) plt.yticks(y, **kwargs)
设置图形风格
|-----------------|---------------------|
| color(颜色字符) | linestyle(风格字符) |
| r 红色 | - 实线 |
| g 绿色 | -- 虚线 |
| b 蓝色 | -. 点划线 |
| w 白色 | : 点虚线 |
| c 青色 | ' ' 空格,留空 |
| m 洋红 | |
| y 黄色 | |
| k 黑色 | |
3.添加题目、x、y轴标签和保存图片
python
# 1.准备x轴(60分钟)和 y轴(每分钟的温度)的数据.
x = range(60)
y = [np.random.uniform(15,18) for i in x]
print(y)
# 创建画布
# 参1:画布大小(长,宽) 参2:dpi(像素密度)
plt.figure(figsize=(10,5),dpi=80)
# 准备数据(x轴, y轴)
plt.scaner(x,y,color = 'red') # color可以选择折线颜色
# 设置x,y轴的标签
# 准备x,y轴的刻度信息
x_ticks_lable = [f'11点{i}分' for i in x]
y_ticks = range(40)
# 具体的添加x轴,y轴刻度信息的动作
plt.xticks(x[::5],x_ticks_lable[::5]) # 参1:x轴刻度值 参2:x轴刻度值对应的标签
plt.yticks(y_ticks[::5])
# 添加标题和标签
plt.title('某地区每分钟温度示意图',fontsize=20) #fontsize=20调节字号大小
plt.xlabel('时间')
plt.ylabel('温度')
# 添加网格线
# 参1:网格线的样式 参2:网格线的透明度
plt.grid(linestyle='--',alpha=0.5)
# 保存图片写在show()前
plt.savefig('temperature.png')
# 具体绘图
plt.show()
运行结果:

4.在一个坐标系中绘制多个图表
plot()两次
python
# 1.准备x轴(60分钟)和 y轴(每分钟的温度)的数据.
x = range(60)
y1 = [np.random.uniform(15,18) for i in x]
y2 = [np.random.uniform(5,10) for i in x]
# 创建画布
# 参1:画布大小(长,宽) 参2:dpi(像素密度)
plt.figure(figsize=(10,5),dpi=80)
# 准备数据(x轴, y轴)
plt.plot(x,y1,color = 'red',label='北京') # color可以选择折线颜色
plt.plot(x,y2,color = 'blue',label='上海',linestyle='--') # color可以选择折线颜色
# 设置x,y轴的标签
# 准备x,y轴的刻度信息
x_ticks_lable = [f'11点{i}分' for i in x]
y_ticks = range(30)
# 具体的添加x轴,y轴刻度信息的动作
plt.xticks(x[::5],x_ticks_lable[::5]) # 参1:x轴刻度值 参2:x轴刻度值对应的标签
plt.yticks(y_ticks[::5])
# 添加标题和标签
plt.title('某地区每分钟温度示意图',fontsize=20) #fontsize=20调节字号大小
plt.xlabel('时间')
plt.ylabel('温度')
# 添加网格线
# 参1:网格线的样式 参2:网格线的透明度
plt.grid(linestyle='--',alpha=0.5)
plt.legend(loc=0)
# 保存图片写在show()前
plt.savefig('temperature.png')
# 具体绘图
plt.show()

一个图纸中画多个图(面向对象的画图方法)
1.两张图的画法
变化1:
创建画布时用的是plt.subplots(行数,列数,figsize=()) # 行数=1,列数=2 就是一行有两张图
变化2:
需要接收plt.subplots()的返回值,用于后面的画图。
axes0、axes1分别是从左到右的两张图
变化3:
因为是面向对象,所以设置x轴、y轴的刻度信息、标题、标签都得函数都有一个前缀 'set_'。如x轴的刻度信息 axesi.set_xticks(...)、设置标题axesi.set_title(...)
python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.lines import lineStyles
from pyparsing import alphas
# 解决中文无法显示的问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 1.准备x轴(60分钟)和 y轴(每分钟的温度)的数据.
x = range(60)
y1 = [np.random.uniform(15,18) for i in x]
y2 = [np.random.uniform(5,10) for i in x]
# 创建画布
# 参1:画布大小(长,宽) 参2:dpi(像素密度)
fig, axes = plt.subplots(1,2,figsize=(20,6))
# 准备数据(x轴, y轴)
axes[0].plot(x,y1,color = 'red',label='地区1') # color可以选择折线颜色
axes[1].plot(x,y2,color = 'blue',label='地区2',linestyle='--')
# 设置x,y轴的标签
# 准备x,y轴的刻度信息
x_ticks_lable = [f'11点{i}分' for i in x]
y_ticks = range(30)
# 具体的添加x轴,y轴刻度信息的动作
axes[0].set_xticks(x[::5],x_ticks_lable[::5]) # 参1:x轴刻度值 参2:x轴刻度值对应的标签
axes[0].set_yticks(y_ticks[::5])
axes[1].set_xticks(x[::5],x_ticks_lable[::5]) # 参1:x轴刻度值 参2:x轴刻度值对应的标签
axes[1].set_yticks(y_ticks[::5])
# 添加标题和标签
axes[0].set_title('某地区1每分钟温度示意图',fontsize=15) #fontsize=15调节字号大小
axes[0].set_xlabel('时间')
axes[0].set_ylabel('温度')
axes[1].set_title('某地区2每分钟温度示意图',fontsize=15) #fontsize=15调节字号大小
axes[1].set_xlabel('时间')
axes[1].set_ylabel('温度')
# 添加网格线
# 参1:网格线的样式 参2:网格线的透明度
axes[0].grid(linestyle='--',alpha=0.5)
axes[1].grid(linestyle='-.',alpha=0.5)
axes[0].legend(loc=0)
axes[1].legend(loc=0)
# 保存图片写在show()前
plt.savefig('temperature.png')
# 具体绘图
plt.show()
运行结果:

2.四张图的画法
在上面的基础上,axes从为一维数组变成了二维数组。如果是2x2的四张表,axes0,0表示左上方的图,axes0,1表示右上方的图,axes1,0表示左下方的图,axes表示右下方的图。(相当于是位置坐标)
然后就是针对每一张图的需求进行具体的修改。
python
import matplotlib.pyplot as plt
import numpy as np
# 设置中文字体(避免乱码,根据系统字体调整)
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'Arial Unicode MS'] # 用于显示中文
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
# 生成示例数据
np.random.seed(42)
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
x_scatter = np.random.rand(50)
y_scatter = x_scatter * 0.8 + np.random.randn(50) * 0.05
categories = ['A', 'B', 'C', 'D']
values = [23, 45, 12, 67]
data_hist = np.random.normal(loc=0, scale=1, size=1000)
# 创建 2x2 的子图画布
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
fig.suptitle('四种常见图形示例', fontsize=16)
# 子图1:折线图
axes[0, 0].plot(x, y1, label='sin(x)', color='blue', linewidth=2)
axes[0, 0].plot(x, y2, label='cos(x)', color='red', linestyle='--')
axes[0, 0].set_title('折线图')
axes[0, 0].set_xlabel('x')
axes[0, 0].set_ylabel('y')
axes[0, 0].legend()
axes[0, 0].grid(True, alpha=0.3)
# 子图2:散点图
axes[0, 1].scatter(x_scatter, y_scatter, c='green', alpha=0.6, edgecolors='black', s=50)
axes[0, 1].set_title('散点图')
axes[0, 1].set_xlabel('X 值')
axes[0, 1].set_ylabel('Y 值')
axes[0, 1].grid(True, alpha=0.3)
# 子图3:柱状图
bars = axes[1, 0].bar(categories, values, color=['skyblue', 'lightcoral', 'lightgreen', 'gold'],
edgecolor='black')
axes[1, 0].set_title('柱状图')
axes[1, 0].set_xlabel('类别')
axes[1, 0].set_ylabel('数值')
# 在柱子上方显示数值
for bar in bars:
height = bar.get_height()
axes[1, 0].text(bar.get_x() + bar.get_width()/2., height + 1,
f'{int(height)}', ha='center', va='bottom')
# 子图4:直方图
axes[1, 1].hist(data_hist, bins=30, color='purple', alpha=0.7, edgecolor='black', density=True)
axes[1, 1].set_title('直方图(正态分布)')
axes[1, 1].set_xlabel('数值')
axes[1, 1].set_ylabel('概率密度')
axes[1, 1].grid(axis='y', alpha=0.3)
# 自动调整子图间距
plt.tight_layout()
plt.show()
运行结果:

官方案例库
Examples --- Matplotlib 3.11.0 documentation

官方提供了很多案例,从上面理解了画图思路,可以在案例里改数据直接拿过来用,不用再自己手打了!
常见图形种类及意义
1. 折线图
折线图:以折线的上升或下降来表示统计数量的增减变化的统计图。
特点:能够显示数据的变化趋势,反映事物的变化情况。(变化)
api: plt.plot(x, y)
2.柱形图
柱状图:排列在工作表的列或行中的数据可以绘制到柱状图中。
特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别。(统计/对比)
api: plt.bar(x, width, align='center', **kwargs)
3.直方图
直方图:由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据范围,纵轴表示分布情况。
特点:绘制连续性的数据展示一组或者多组数据的分布状况(统计)
api: matplotlib.pyplot.hist(x, bins=None)
4.饼图
饼图:用于表示不同分类的占比情况,通过弧度大小来对比各种分类。
特点:分类数据的占比情况(占比)
api: plt.pie(x, labels=,autopct=,colors)
5.散点图
散点图:用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。
特点:判断变量之间是否存在数量关联趋势,展示离群点(分布规律)
api: plt.scatter(x, y)