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,一经查实,立即删除!

相关文章

给定两个字符串 s 和 t ,找不同

题意&#xff1a; 给定两个字符串 s 和 t &#xff0c;它们只包含小写字母。 字符串 t 由字符串 s 随机重排&#xff0c;然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。 示例 1&#xff1a; 输入&#xff1a;s “abcd”, t “abcde” 输出&#xff1a;“e”…

【python学习】基础篇-常用第三方库-psutil:用于获取CPU、磁盘与网络等系统信息和进程管理

psutil是一个跨平台的Python库&#xff0c;用于获取系统信息和进程管理。以下是一些基本的用法&#xff1a; 获取CPU使用率 cpu_percent psutil.cpu_percent(interval1) print(cpu_percent)获取内存使用情况 memory_info psutil.virtual_memory() print(memory_info.perce…

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为数据库…

QT中的lambda表达式

面是对Qt中在QObject::connect()中的lambda表达式常用用法 QString str("I am a string!"); devicestr; connect(ui- connect(m_imgshowUI, &ImgShow::GetImgPath, m_visionplatform, [](const std::string filename){m_visionplatform->ReadImg(filename);}…

moviepy 视频剪切,拼接,音频处理

官网 使用matplotlib — moviepy-cn 文档 案例 from moviepy.editor import * from moviepy.video.fx import resize from PIL import Imagefile1r"D:\xy_fs_try\video_to_deal\spider_video\file\vedeo3.mp4" file2r"D:\xy_fs_try\video_to_deal\spider_video\…

Maven聚合项目发布至私服指定模块

无论是从事框架开发工作还是公共服务模块开发&#xff0c;为了解决通用性问题&#xff0c;常常需要发布一些依赖组件至maven私服。然而通常我们得maven工程都是由多个模块组成得聚合工程&#xff08;一个父工程下有多个模块&#xff09;。 这个时候可能会面临两个窘境&#xf…

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

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

java实现一个简单的监听器

在 Java 中&#xff0c;我们可以通过实现监听器&#xff08;Listener&#xff09;模式来处理事件和回调。监听器模式是一种常见的设计模式&#xff0c;用于实现对象间的松耦合通信。本文将介绍如何在 Java 中实现一个简单的监听器。 步骤 以下是实现一个监听器的基本步骤&…

关于input直接上传文件夹

用最基础的input 就可以实现 <input type"file" webkitdirectory directory"" /> 如果是像点击按钮之后上传文件夹可以这样写 <el-button type"primary" style"margin-top: 30px;width: 170px;" click"importModel&qu…

教你ehco、date、sep命令如何使用

echo命令 echo -n 表示不换行输出 echo -e 表示输出转义符 常用的转义符 选项 作用 \r 光标移至行首&#xff0c;并且不换行 \s 当前shell的名称&#xff0c;如bash \t 插入Tab键&#xff0c;制表符 \n 输出换行 \f 换行&#xff0c;但光标仍停留在原处 \ 表…

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

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

GPS北斗卫星同步时钟系统(北斗授时设备)在通信系统中应用

GPS北斗卫星同步时钟系统(北斗授时设备)在通信系统中应用 GPS北斗卫星同步时钟系统(北斗授时设备)在通信系统中应用 卫星时间同步系统是根据《华东电网统一时钟系统技术规范》、《上海电网GPS时间同步系统技术原则和运行管理规定》和《电力系统时间同步技术规范》设计的时间同步…

【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日 | 中国广州 会…

Go使用开源库go-excelize操作Excel文件

以下是一个示例代码&#xff0c;读取一个 Excel 文件并打印其中的所有单元格值&#xff1a; package mainimport ("fmt""github.com/30x/go-excelize" )func main() {// 打开 Excel 文件f, err : excelize.OpenFile("yourfile.xlsx")if err ! n…

uniapp开发ios跳转应用商店方法

//#ifdef APP-PLUS//在App Store Connect中的App Store下的app信息&#xff0c;可找到appleIduni.showModal({title: "版本更新",content: 有新的版本发布&#xff0c;是否立即进行新版本下载&#xff1f;,confirmText: 立即更新,cancelText: 稍后进行,success: (res…