问题描述:最近要把杭州市地磁检测器中交通流量按照时间序列画图,每个路口画一张图,每个路口有多个车道,每个车道下包含一个检测器
数据形式:
代码:
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)
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:
print(group)
print('========================1')
grouped_data = df.get_group(group)
time_strseries = grouped_data['acquisition_time'].tolist()
volume_intseries = grouped_data['flow']
if str(all_road_id_list[i]) == str(group[0]):
count += 1
print(count)
ax = fig.add_subplot(4, 4, count)
ax.xaxis.set_major_formatter(mdate.DateFormatter('%H'))
datetime_start = time_strseries[0]
datatime_1day = dt.timedelta(days=1)
datetime_end = datetime_start + datatime_1day
plt.xlim([datetime_start, datetime_end])
plt.xticks(pd.date_range(datetime_start, datetime_end, freq='6H'),rotation=45)
plt.plot(time_strseries, volume_intseries)
ax.set_ylabel("flow")
ax.set_xlabel("time")
plt.title("flow-time:" + group[0] + "-" + group[1] + "")
plt.tight_layout()
plt.savefig("C:/image/'" + all_road_id_list[i] + "'.png")
count = 0
输出结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/60672fbbc10e402ebb55fe3dd5959059.png#pic_center)
[1] python绘制子图技巧——plt.subplot和plt.subplots、及坐标轴修改 2022.6;
[2] Matplotlib学习手册A006_Figure的add_subplot()方法 2019.11;
[3] matplotlib之pyplot模块——调整子图布局(subplots_adjust、tight_layout)2021.4;
[4] python for循环画多子图并保存(涉及DateFrame.groupby,add_subplot)2018.9;
python如何实现循环保存图片,以及怎么保存groupby的数据
首先将代码放上来,方便一些伸手的兄弟,但如果兄弟不烦唠叨,可以继续往下看一下我发现的其中一些数以事项
# 首先通过groupby把数据集分组,然后进行保存
def get_m3044_container():
columns = ['container_id', 'machine_id', 'time_stamp', 'cpu_util_percent',
'mem_util_percent', 'cp
有时候我们需要绘制好几个图代码,手动写每个subplot的代码,然而这样代码重复量太大。而绘图部分代码大部分相同甚至完全一样,能不能用for循环的方式呢?
开始进入正题,代码如下:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
# 设置属性防止中文乱码
mpl.rcParams['font.sans-serif'] = [
对于某个城市的出租车数据,一天就有33210000条记录,如何将每辆车的数据单独拎出来放到一个专属的文件中呢?
思路很简单:
就是循环33210000条记录,将每辆车的数据搬运到它该去的文件中。
但是对于3000多万条数据,一个一个循环太消耗时间,我花了2个小时才搬运了60万数据,算算3000万我需要花费100个小时,也就需要4-5天。并且还需要保证这五天全天开机,不能出现卡机的事故。
因此,需要使用并行进行for循环的技巧:
由于3000万数据放到csv中导致csv打不开,因此我就把一个csv通过split软件将其切分成每份60万,共53个csv。
我原来的思路是读取文件夹,获取由每一个60
def main():
sum = 0 # 定义变量做累加器
n = int(input('n=')) #\u4ece\u952e\u76d8\u4e0a\u8f93\u5165\u7d2f\u52a0\u7684\u8303\u56f4\n for x in range(n): \n sum += (x + 1)\n print(sum)\nif __name__ == '__main__':
main()
用for循环实现1~n求和的方法
def main():
sum = 0
n = int(input('n='))
- `plt.subplot(3, 1, i+1)` 表示将画布分成 3 行 1 列,当前画图的位置是第 i+1 个位置。
- `plt.ylabel('y' + str(i+1))` 表示为当前子图添加纵轴标题,标题为 "y" 加上当前循环次数。
执行以上代码可以得到三个子图,每个子图都有一个纵轴标题。你可以根据自己的需求修改代码中的数据和画图参数。