python for循环画多子图并保存(涉及DateFrame.groupby,add_subplot)

问题描述:最近要把杭州市地磁检测器中交通流量按照时间序列画图,每个路口画一张图,每个路口有多个车道,每个车道下包含一个检测器

数据形式:

代码: 

import pandas as pd
import psycopg2
import matplotlib.pyplot as plt
import datetime as dt
import matplotlib.dates as mdate

str_date = '2018-08-12'
count = 0
#连接数据库
data = call_postgres(str_date, coon)
# 把路口ID去重,得到所有路口ID
all_road_id_list = data.drop_duplicates(['devc_id'])['devc_id'].tolist()
"""data在call_postgres()中已经转化成DateFrame格式,再通过路口ID和车道ID分组,得到每个检测器的所有数据"""
df = data.groupby(['devc_id', 'devc_lane'])
for i in range(len(all_road_id_list)):
    #设置画布大小
    fig = plt.figure(figsize=(16, 16))
    for group in df.groups:
        #group是一个元组,包含了分组的路口ID和车道ID
        print(group)
        print('========================1')
        # print(group[0])
        #get_group()得到每个检测器的数据 
        grouped_data = d
<think>我们正在讨论的是Matplotlib中的`fig.add_subplot(111)`,而不是之前的`lambdify`。用户引用了三个关于Matplotlib的引用,但主要问题集中在`ax = fig.add_subplot(111)`的作用上。 根据引用[2]和引用[3],我们知道在Matplotlib中,有两种常用的创建子的方式:一种是使用`plt.subplots()`,另一种是使用`fig.add_subplot()`。用户询问的是后者的具体形式`add_subplot(111)`。 功能解释: 在Matplotlib中,`fig = plt.figure()`创建了一个形对象(figure)。然后,`ax = fig.add_subplot(111)`在这个形对象上添加一个(axes)。这里的参数`111`实际上是指子布局为1行1列的第1个位置(即整个形区域只有一个)。因此,这个操作创建了一个单子形。 参数说明: `add_subplot`的参数通常是一个三位整数(如`111`)或三个独立的整数(如`(1,1,1)`)。这三个数字分别代表: - 行数(nrows) - 列数(ncols) - 子的索引(index,从1开始) 所以,`111`表示:1行,1列,第1个子(也是唯一的一个)。 注意:在Matplotlib的旧版本中,使用三位整数作为参数是允许的,但也可以使用三个单独的参数。现在,我们也可以使用`fig.add_subplot(1,1,1)`,效果相同。 用途: 当我们只需要在形中绘制一个单独的表时,就会使用`add_subplot(111)`。这样,我们就可以在返回的`ax`对象上调用各种绘方法(如`plot`、`scatter`等)来在这个子上绘制形。 示例代码: ```python import matplotlib.pyplot as plt # 创建一个形对象 fig = plt.figure() # 添加一个,位置在1行1列的第1个(整个形) ax = fig.add_subplot(111) # 在子上绘制数据 ax.plot([1,2,3], [4,5,6]) plt.show() ``` 与`plt.subplots()`的对比: 另一种创建形和子的方法是使用`plt.subplots()`,特别是当形有个子时更为方便。例如,创建单个子可以这样: ```python fig, ax = plt.subplots() # 默认是1行1列,所以ax就是单个子 ``` 但是,使用`add_subplot`的好处是可以在已有的形上灵活地添加子,特别是当子的布局不规则时(比如子大小不一致,或者子跨越个网格位置),我们可以使用`fig.add_subplot`配合不同的参数来创建复杂的布局。 引用说明: 在引用[3]中,展示了使用`add_subplot`创建不同布局的子。例如: ```python fig=plt.figure(figsize=(5,4)) ax1=fig.add_subplot(1,2,1) # 1行2列的第1个子 ax2=fig.add_subplot(1,3,2) # 1行3列的第2个子 ``` 注意:这里第二个子的位置参数是`(1,3,2)`,表示在1行3列的第2个位置(即中间位置)。所以,这两个子实际上位于不同的网格布局中,这会导致它们的大小和位置不同。 因此,`add_subplot(111)`是创建单个子的传统方法。 相关问题: 基于这个主题,我们可以提出以下相关问题: 1. 在Matplotlib中,`add_subplot(111)`和`plt.subplots()`创建单个子有何区别? 2. 如何用`add_subplot`创建个子? 3. 在Matplotlib中,如何创建不规则的子布局(例如,一个占据列)? 注意:我们不需要回答这些问题,只需要在回答末尾以“§§相关问题§§”的形式列出即可。</think>### Matplotlib 中 `ax = fig.add_subplot(111)` 的功能详解 在 Matplotlib 中,`ax = fig.add_subplot(111)` 用于在形对象(Figure)上创建坐标系(Axes)。这是 Matplotlib 的核心绘机制之一,其功能和使用方法如下: #### 功能解析 1. **创建坐标系对象** - `fig = plt.figure()` 创建空形容器 - `add_subplot(111)` 在形中添加坐标系(Axes) - 参数 `111` 表示:1行1列网格的第1个位置(即整个形区域) 2. **坐标系网格布局** 参数格式:`(行数, 列数, 位置索引)` - `111` = `(1,1,1)`:单坐标系布局(默认) - `235` = `(2,3,5)`:2行3列网格的第5个位置 3. **返回值作用** `ax` 是坐标系对象,提供以下功能: - 控制绘区域(坐标轴、刻度、标签) - 实现各种绘方法(`plot()`, `scatter()`, `imshow()`等) - 管理形元素(例、文本、网格等) #### 使用示例 ##### 基础用法 ```python import matplotlib.pyplot as plt # 创建形和坐标系 fig = plt.figure(figsize=(6,4)) # 创建形容器 ax = fig.add_subplot(111) # 添加坐标系 # 在坐标系上绘 ax.plot([1,2,3], [4,5,6], 'ro-') ax.set_title("单坐标系示例") # 设置标题 plt.show() ``` ![单坐标系示例](https://via.placeholder.com/300x200?text=Figure+with+Single+Axes) ##### 坐标系布局 ```python fig = plt.figure(figsize=(10,4)) # 创建2x1网格布局 ax1 = fig.add_subplot(211) # 2行1列第1位置 ax1.plot([1,2,3], [1,4,9]) ax1.set_title("子1") ax2 = fig.add_subplot(212) # 2行1列第2位置 ax2.scatter([1,2,3], [9,4,1]) ax2.set_title("子2") plt.tight_layout() ``` ![坐标系示例](https://via.placeholder.com/400x200?text=Multi-Axes+Layout) #### 与 `plt.subplots()` 的对比 | **特性** | `add_subplot(111)` | `plt.subplots()` | |-------------------|------------------------------------|--------------------------------------| | **创建方式** | 显式创建Figure后添加Axes | 一次性创建Figure和Axes对象 | | **返回值** | 单个Axes对象 | (Figure, Axes)元组 | | **多子图支持** | 需次调用`add_subplot()` | 通过`nrows`,`ncols`参数一次性创建 | | **灵活性** | 支持不规则网格布局[^3] | 适合规则网格布局 | | **典型应用场景** | 动态添加子/复杂布局 | 常规多子图布局 | #### 最佳实践 1. **单场景优先使用** ```python # 简洁写法 fig, ax = plt.subplots(figsize=(6,4)) ``` 2. **不规则布局使用`add_subplot()`** ```python fig = plt.figure() ax1 = fig.add_subplot(231) # 左上 2x3网格第1位置 ax2 = fig.add_subplot(235) # 中间 2x3网格第5位置 ax3 = fig.add_subplot(236) # 右下 2x3网格第6位置 ``` 3. **坐标系统一管理** ```python ax.set_xlabel("X轴") # 设置X轴标签 ax.set_ylabel("Y轴") # 设置Y轴标签 ax.grid(True, ls=':') # 启用虚线网格 ax.legend(['数据系列']) # 添加例 ``` #### 常见问题 1. **`111`参数过时问题** 新版本Matplotlib推荐使用显式参数: ```python # 旧写法 (兼容但已过时) ax = fig.add_subplot(111) # 新写法 (推荐) ax = fig.add_subplot(1,1,1) ``` 2. **坐标系重叠问题** 当次调用`add_subplot()`时,需确保位置不冲突: ```python # 错误:位置重叠 ax1 = fig.add_subplot(111) ax2 = fig.add_subplot(111) # 覆盖前一个坐标系 # 正确:指定不同位置 ax1 = fig.add_subplot(211) ax2 = fig.add_subplot(212) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值