Matplotlib绘图

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)

相关推荐
KaMeidebaby1 小时前
卡梅德生物技术快报|biotin 生物素标记抗体全流程
前端·人工智能·算法·数据挖掘·数据分析
Asa121383 小时前
Nature系列综述|核质病毒门病毒的感染周期
数据分析
l1t3 小时前
DeepSeek总结的MariaDB + DuckDB:数据分析的新游乐场——初探新存储引擎
数据分析·mariadb
oscar9993 小时前
当电子表格遇上 ChatGPT:像聊天一样做数据分析
chatgpt·数据挖掘·数据分析
babe小鑫3 小时前
2026年大数据与计算机专业学习数据分析的技术价值
大数据·学习·数据分析
城数派13 小时前
1951-2024年我国逐日\逐月\逐年降水率栅格数据
信息可视化
精益数智小屋16 小时前
项目管理看板如何拆解任务进度?项目管理看板解决跨部门协作难题
大数据·人工智能·数据分析·云计算·软件工程
wayz1118 小时前
Momentum:TSI(真实强度指数)技术指标详解
算法·金融·数据分析·量化交易·特征工程
MATLAB代码顾问19 小时前
Python Matplotlib数据可视化实战指南
python·信息可视化·matplotlib