python 水质日历热力图

利用日历热力图可以方便的查看站点水质全年的变化情况。

接口获取站点数据

这一步根据自己实际情况,也可以读取excel、MySQL读取数据。这里把API地址已隐去。

import numpy as np
import calendar
import requests
import json
import pandas as pd
import time
from datetime import date, datetime, timedelta
import matplotlib.pyplot as plt
from matplotlib.pylab import style  # 自定义图表风格
# style.use('ggplot')
# 解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['Simhei']# 解决坐标轴刻度负号乱码
plt.rcParams['axes.unicode_minus'] = False
connect_table =pd.read_excel("设备因子对照.xls")
# 根据时间、站点名称参数获取API url
def url_ask(beginTime,endTime,mn,period):# beginTime 要拉取的数据开始时间节点(yyyy-MM-dd HH:mm:ss)# endTime = "2023-10-30 00:00:00" #前闭后开# mn 设备编码# page当前页码# 原始接口中包括page和pagesize 默认1和10000   # 这里需要注意 不宜太大,暂内存,二是如果查询内容过大则会超过1页,需要查询total page 字段的数字,并判断# period 时间周期,实时为空,但要带这个请求参数,1小时为h1,4小时为h4,天数据为d1 page ="1"pageSize ="10000"mianurl = "             "ip_port = "             "       url =ip_port + mianurl+"beginTime="+beginTime+"&endTime="+endTime +"&mn="+mn +"&page="+page +"&period=" +period +"&pageSize="+pageSize# 发起API请求获取JSON数据return(url)
# 根据站点名称求编码
def seak_mn(ask_station):mn_text = connect_table.loc[connect_table['设备名称'] ==ask_station] mn = mn_text.mn.unique()[0]return(mn)period = "h4"
ask_station = '湾凼'
mn = seak_mn(ask_station)
url =url_ask('2023-01-01 00:00:00','2023-11-20 00:00:00',mn,period)# 根据URL 获取站点监测数据 未经降维
def mn_value(url):response = requests.get(url)response_data = response.json()data =response_data["data"]titles =data["titles"]titles= pd.DataFrame(titles)factor_code = titles["identifier"]factor_name = titles["name"]# 查询监测数据df_value =data["items"]df_value = pd.DataFrame(df_value,columns=factor_code)df_value.columns= factor_namedf_value.rename(columns={'上报时间': '监测时间'}, inplace=True)return(df_value)
df_value =mn_value(url)
df_value.tail()

输出数据结构如下:

进行站点等级评价

选择 '氨氮', '高锰酸盐指数', '总磷',作为评价因子,以地表水评价导则判断各因子的评价等级,

再按照因子评价等级最高的最为站点评价等级。

df = df_value[['氨氮', '高锰酸盐指数', '总磷', '监测时间']]  
# 数据清洗
df = df.replace(0, np.nan)  # 将0替换为NaN
df = df.dropna(axis=0, how='any')  # 删除包含NaN的行
# 将监测时间转换为日期,并计算日平均值
df['监测时间'] = pd.to_datetime(df['监测时间'])
df['日期'] = df['监测时间'].dt.date
df = df.groupby('日期').mean().reset_index()# 数据评价
def evaluate_index(value, limits):for i, limit in enumerate(limits):if value <= limit:return i + 1return len(limits) + 1# 设置各因子的标准限值
limits = {'高锰酸盐指数': [2, 4, 6, 10, 15],'氨氮': [0.15, 0.5, 1, 1.5, 2.0],'总磷': [0.02, 0.1, 0.2, 0.3, 0.4]
}# 计算评价等级
for factor, limit in limits.items():df[f'{factor}评价等级'] = df[factor].apply(lambda x: evaluate_index(x, limit))# 计算站点评价等级
df['站点评价等级'] = df[['高锰酸盐指数评价等级', '氨氮评价等级', '总磷评价等级']].max(axis=1)

最后的结果如下图

日历热力图的绘制

通过简单查询可以知道这个点位的等级范围为2-6类(Ⅱ类到劣Ⅴ类)

第一种方式 calmap库

import pandas as pd
import calmap
import matplotlib.pyplot as plt
import matplotlib.dates as mdates# 将日期列转换为日期类型
df['日期'] = pd.to_datetime(df['日期'])# 确保站点评价等级是数值类型
df['站点评价等级'] = pd.to_numeric(df['站点评价等级'])# 创建日历热力图
fig, ax = plt.subplots(figsize=(20, 6), dpi=300)
calmap.yearplot(df.set_index('日期')['站点评价等级'], year=2023, cmap='RdYlGn_r', linewidth=0.01, linecolor='grey', monthticks=5, monthlabels='none')# 添加颜色条
cmap = plt.cm.get_cmap('RdYlGn_r', 6)  # 选择颜色映射,这里假设我们将颜色分为7个区间
bounds = [0.5, 1.5, 2.5, 3.5, 4.5, 5.5]  # 设置颜色条的分割点
norm = plt.cm.colors.BoundaryNorm(bounds, cmap.N)  # 根据分割点创建颜色映射
sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
sm.set_array([])
cbar = plt.colorbar(sm, orientation='horizontal', ticks=[1, 2, 3, 4, 5], shrink=0.4)  # 设置颜色条的标记位置
cbar.ax.set_xticklabels(['Ⅱ类', 'Ⅲ类', 'Ⅳ类', 'Ⅴ类', '劣Ⅴ类'])
cbar.set_label('水质等级', fontsize=14)# 自定义月份显示为中文
plt.gca().set_xticklabels(['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'])# 调整图形布局
plt.subplots_adjust(left=0.05, right=0.95, top=0.95, bottom=0.2)# 设置图形标题
label_name = ask_station + "2023年水质等级日历热力图"
plt.title(label_name, fontsize=16)
# 保存图形到本地
# plt.savefig("calendar_heatmap.png")
# 显示图形
plt.show()

缺点比较明显 不能交互,且月份之间间隔不明显。

第一种方式 pyecharts库

代码更简洁,效果还可以,输出格式为html,可交互,逻辑更清晰。

import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Calendar# 将日期列转换为日期类型
df['日期'] = pd.to_datetime(df['日期'])# 确保站点评价等级是数值类型
df['站点评价等级'] = pd.to_numeric(df['站点评价等级'])# 获取日期和评价等级数据
data = df[['日期', '站点评价等级']].values.tolist()# 创建日历热力图
calendar = (Calendar().add("", data, calendar_opts=opts.CalendarOpts(range_='2023')).set_global_opts(title_opts=opts.TitleOpts(title=ask_station + "2023年水质等级日历热力图"),visualmap_opts=opts.VisualMapOpts(max_=5,min_=1,orient="horizontal",pos_top="230px",pos_left="center",is_piecewise=True,pieces=[{"min": 1, "max": 2, "label": "Ⅱ类", "color": "#00E500"},{"min": 2, "max": 3, "label": "Ⅲ类", "color": "blue"},{"min": 3, "max": 4, "label": "Ⅳ类", "color": "#FFA500"},{"min": 4, "max": 5, "label": "Ⅴ类", "color": "#FF0000"},{"min": 5, "max": 6, "label": "劣Ⅴ类", "color": "#800080"},],           ),).render("calendar_heatmap.html")
)# 还是有改进的地方,比如根据等级的上下限自动匹配色块

小结

从图中可以看到该站点4-10月水质较差,其他月份水质为Ⅲ类及以下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/159324.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux:进度条(小程序)以及git三板斧

Linux小程序&#xff1a;进度条 在实现小程序前我们要弄清楚&#xff1a; 1.缓冲区&#xff1b; 2.回车与换行。 缓冲区&#xff1a; 分别用gcc来编译下面两个程序&#xff1a; 程序一&#xff1a; #include <stdio.h> int main() { printf("hello Makefil…

前后端分离SpringBoot+vue的买菜农副产品多功能商城

1&#xff0c;项目介绍 本系统主要针对买菜而设计&#xff0c;其功能有菜品基本信息管理、商品类别管理、系统订单管理、评论管理、系统用户管理等功能模块。并且本系统采用了现在流行的SpringBootVue进行的设计与实现&#xff0c;其中Tomcat为服务器&#xff0c;MySQL为数据库…

小红书干货类笔记怎么写?建议收藏

小红书干货类笔记是指在小红书这个社交平台上&#xff0c;用户分享的各种实用、有价值的生活技巧、经验、心得等内容的笔记。这类笔记通常具有以下特点&#xff1a;内容详实、实用性强、独特见解、图文并茂。 比如&#xff1a;某个妆要怎么化、某种技能该怎么学、某个城市该怎…

【开源】基于JAVA的开放实验室管理系统

项目编号&#xff1a; S 013 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S013&#xff0c;文末获取源码。} 项目编号&#xff1a;S013&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 实验室类型模块2.2 实验室模块2.3 实…

【Vue】生命周期一文详解

目录 前言 生命周期 钩子函数使用方法 ​编辑 周期-----创建阶段 创建阶段做了些什么事 该阶段可以干什么 周期----挂载阶段 挂载阶段做了什么事 该阶段适合干什么 周期----更新阶段 更新阶段做了什么事 该阶段适合做什么 周期----销毁阶段 销毁阶段做了什么事 …

C++:继承

一、继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保 持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象 程序设计的层次结构&#xff0c…

使用Microsoft Dynamics AX 2012 - 4. 销售和配送

销售和分销的主要职责是为客户提供您的商品和服务。为了完成这项任务&#xff0c;销售和分销需要通过分拣、运输和开具发票来处理销售订单&#xff0c;从而管理客户的材料需求。 销售和配送业务流程 在我们开始详细介绍之前&#xff0c;下面几行概述了销售和配送中的业务流程…

【IEEE独立出版 | 往届均完成检索】2024年第四届消费电子与计算机工程国际学术会议(ICCECE 2024)

#国际学术会议# 推荐 #广州# 【IEEE独立出版 | 往届均完成检索】2024年第四届消费电子与计算机工程国际学术会议&#xff08;ICCECE 2024&#xff09; 2024 4th International Conference on Consumer Electronics and Computer Engineering 2024年1月12-14日 | 中国广州 会…

监控摄像头连接NAS,实现监控管理一体化

嗯&#xff1f;你问干嘛要把摄像头连到NAS&#xff1f; 小马给家里安了个监控摄像头 本意是想家里有啥事也能查监控 却没想到这些监控不仅存储回放有限制 要想更多功能还是得多花钱 恰好&#xff0c;我有铁威马NAS 打开Surveillance Manager 轻松搭建网络摄像头管理系统 …

Leaflet结合Echarts实现迁徙图

效果图如下&#xff1a; <!DOCTYPE html> <html><head><title>Leaflet结合Echarts4实现迁徙图</title><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

14.(vue3.x+vite)组件间通信方式之pinia

前端技术社区总目录(订阅之前请先查看该博客) 示例效果 Pinia简介 Pinia 是 Vue 的存储库,它允许您跨组件/页面共享状态。 Pinia与Vuex比较 (1)Vue2和Vue3都支持,这让我们同时使用Vue2和Vue3的小伙伴都能很快上手。 (2)pinia中只有state、getter、action,抛弃了Vu…

世微 dc-dc降压恒流 LED汽车大灯 单灯 14V5A 68W车灯驱动方案 AP5191

产品描述 AP5191是一款PWM工作模式,高效率、外围简单、外置功率MOS管&#xff0c;适用于4.5-150V输入的高精度降压LED恒流驱动芯片。输出最大功率150W&#xff0c;最大电流6A。AP5191可实现线性调光和PWM调光&#xff0c;线性调光脚有效电压范围0.55-2.6V.AP5191 工作频率可以…

windows搭建gitlab教程

1.安装gitlab 说明&#xff1a;由于公司都是windows服务器&#xff0c;这里安装以windows为例&#xff0c;先安装一个虚拟机&#xff0c;然后安装一个docker&#xff08;前提条件&#xff09; 1.1搜索镜像 docker search gitlab #搜索所有的docker search gitlab-ce-zh #搜索…

视频直播美颜SDK全面解析:美颜SDK技术对比

美颜SDK的出现&#xff0c;为直播主和用户提供了更丰富的美颜体验。 一、美颜SDK的基本原理 美颜SDK多种技术协同工作&#xff0c;使得直播画面更加细腻、自然&#xff0c;给用户带来更好的视觉感受。不同的SDK可能采用不同的算法和处理流程&#xff0c;从而产生各具特色的美…

【深度学习实验】注意力机制(三):打分函数——加性注意力模型

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 理论介绍a. 认知神经学中的注意力b. 注意力机制 1. 注意力权重矩阵可视化&#xff08;矩阵热图&#xff09;2. 掩码Softmax 操作3. 打分函数——加性注意力模型1. 初始化2. 前向传播3. 内部组件…

配电房智能综合监控系统

配电房智能综合监控系统是一种针对配电房环境和设备进行实时监控和管理的系统。依托电易云-智慧电力物联网&#xff0c;它集成了多种先进技术&#xff0c;如物联网、大数据、AI视频智能分析等&#xff0c;实现对配电房全方位、智能化的监控和管理。 这个系统的主要功能可能包括…

用Stable Diffusion帮助进行卡通风格渲染

用Stable Diffusion帮助进行卡通风格渲染 正常风格渲染卡通风格贴图增加涅斐尔边缘高光效果 正常风格渲染 正常的动物写实模型 卡通风格贴图 用Stable Diffusion可以帮助我们将写实贴图转化为卡通风格&#xff08;具体参数可以自己调试&#xff0c;总体上是将提示词强度和图…

Redis整数集合

前言 整数集合(intset)是集合键的底层实现之一&#xff0c;当一个集合只包含整数值元素&#xff0c;并且这个集合的元素数量不多时&#xff0c;Redis就会使用整数集合作为集合键的底层实现。 一. 整数集合的实现 1.1 结构 整数集合(intset)是Redis用于保存整数值的集合抽象数据…

【漏洞复现】DPTech VPN存在任意文件读取漏洞

漏洞描述 DPtech是在网络、安全及应用交付领域集研发、生产、销售于一体的高科技企业。DPtech VPN智能安全网关是迪普科技面向广域互联应用场景推出的专业安全网关产品&#xff0c;集成了IPSec、SSL、L2TP、GRE等多种VPN技术&#xff0c;支持国密算法&#xff0c;实现分支机构…