python使用for循环画多子图
python使用for循环画多子图
·
目录
问题描述:最近要把杭州市地磁检测器中交通流量按照时间序列画图,每个路口画一张图,每个路口有多个车道,每个车道下包含一个检测器
数据形式:
代码:
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 = 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 #计算每个路口的车道数
# count_list.append(count)
print(count)
# 画子图
ax = fig.add_subplot(4, 4, count)
#设置X轴时间序列的格式,这里是只取小时
ax.xaxis.set_major_formatter(mdate.DateFormatter('%H'))
# plt.gca().xaxis.set_major_locator(mdate.DayLocator())
# datetime_start = dt.datetime.strptime('00:00:00', '%H:%M:%S')
#设置X轴范围
datetime_start = time_strseries[0]
datatime_1day = dt.timedelta(days=1)
datetime_end = datetime_start + datatime_1day
plt.xlim([datetime_start, datetime_end])
# 时间间隔,时间标签旋转45度
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.gcf().autofmt_xdate()
plt.tight_layout() # 自动调整子图的间距
#保存图片
plt.savefig("C:/image/'" + all_road_id_list[i] + "'.png")
# plt.show()
# input()
#每个路口结束,清空
count = 0
输出结果:
参考资料
[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;
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献32条内容
所有评论(0)