作者:沂水寒城,CSDN博客专家,个人研究方向:机器学习、深度学习、NLP、CV

Blog: http://yishuihancheng.blog.csdn.net

污染物玫瑰图是一个比较领域化和专业化的名词,主要是在环保数据分析领域中较为经常使用到,如果一开始就来说污染物玫瑰图可能不是很好理解,这里拿一个比较通用的实例来说明,就是风向玫瑰图。

为了更好地说明白风向玫瑰图这个学术化的名词我从百度百科找到了关于它的相关介绍,具体如下:

风向玫瑰图(简称风玫瑰图)也叫风向频率玫瑰图,它是根据某一地区多年平均统计的各个风向和风速的百分数值,并按一定比例绘制,一般多用8个或16个罗盘方位表示,由于形状酷似玫瑰花朵而得名。玫瑰图上所表示风的吹向,是指从外部吹向地区中心的方向,各方向上按统计数值画出的线段,表示此方向风频率的大小,线段越长表示该风向出现的次数越多。将各个方向上表示风频的线段按风速数值百分比绘制成不同颜色的分线段,即表示出各风向的平均风速,此类统计图称为风频风速玫瑰图。接下来简单看几个玫瑰图的实例,具体如下所示:

借用echarts的极坐标堆叠柱状图也可以绘制出来类似的效果只不过暂时没有找到如何对不同区间的浓度值设定不同的颜色的方法,简单的效果图如下所示:

在环保、气象等领域中,风向玫瑰图是非常常用的数据分析可视化手段,与此相关衍生出来的还有一种类似的玫瑰图——污染物玫瑰图,与风向玫瑰图相同的是,在具体计算逻辑以及整体形式上都是比较一致的,不同的是污染物玫瑰图主要是用于分析污染物溯源传播等相关的问题的,在可视化的时候叠加了污染物的浓度数据。

想要绘制污染物的玫瑰图首先我们需要获取到需要的因子浓度数据以及对应的气象数据,这里我们的数据来源于中央气象台以及中国环境监测总站,其中,前者提供了我们所需的气象数据,后者提供了我们所需的因子浓度监测数据。

中国环境检测总站首页数据区域截图如下:

点击详情即可查看,这部分数据的采集我发现网上有开源的实现就直接拿来用了,所以这里就不多做介绍了,如有需要可以留言,我给你提供项目链接,能够获取城市的实时空气数据,包括AQI、pm2.5、pm10、co、o3、no2、so2、首要污染物、生活建议、污染描述等数据。

中央气象台中数据区域截图如下所示:

这里我做了具体的实现,详细介绍请参考我的博客:https://yishuihancheng.blog.csdn.net/article/details/99604953到这里,我们的数据获取工作差不多就结束了,接下来就我们就开始绘制污染物玫瑰图,其实污染物玫瑰图本质上来说就是使用所需分析的污染物的浓度替换了原有的风速数据,将污染物的传播和分布情况借助于气象的数据展示了出来,在很多应用场景里面污染物玫瑰图都是很有帮助,能够有效地定位污染位置等信息。

之前的工作里面我从事过相关的研究项目,对于一些常用的工具模块都已有了比较完整的实现,这里可以很方便地进行调用,下面是具体的Demo代码实现:

def plotPollutionRoseDemo(value,direction,title,save_path='demo.png'):'''污染物可视化Demo'''plt.clf()ax=WindroseAxes.from_ax()ax.bar(direction,value,normed=True,opening=0.8,edgecolor='white')ax.set_legend(loc='best',bbox_to_anchor=(1.1, 1.1))  #loc='lower center',ncol=3plt.title(title,chinese)plt.savefig(save_path)

绘图的代码真的是很简单的,下面是具体的结果:

我觉得还是蛮好看的,当然如果需要放到产品里面的话可能还需要进一步去美化一下。

之前有一些博友留言需要一下绘图的参数设置,这里我一并给出来,如果需要的话可以直接拿去使用:

import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['font.sans-serif']=['SimHei']  #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False  #用来正常显示负号
english={'family':'Times New Roman','weight':'normal','size':12}
chinese={'family':'SimHei','weight':'normal','size':12}
color_list=['#CD853F','#DC143C','#00FF7F','#FF6347','#8B008B','#00FFFF','#0000FF','#8B0000','#FF8C00','#1E90FF','#00FF00','#FFD700','#008080','#008B8B','#8A2BE2','#228B22','#FA8072','#808080']

个人习惯,比较喜欢将一些参数项整合到字典里面封装其起来之后可以很方便地进行调用。

完成绘图模块的开发后,就可以开发API了,基于flask将本地的工具模块暴露成可以直接调用的API服务是比较常用的做法,这里的具体代码实现如下:

#!usr/bin/env python
# encoding:utf-8import os
import sys
import time
import json
from flask import Flask
from flask import request
from flask import make_response
from flask import jsonify
from windRosePloter import *app = Flask(__name__)
reload(sys)
sys.setdefaultencoding("utf-8")@app.route("/")
def init():return u"风向玫瑰图模块正常启动!"    @app.route('/onlinerose',methods=['GET'])
def windRoseFunc():'''风向玫瑰图可视化功能http://IP:port/onlinerose?host=localhost&user=username&passwd=passwd&port=3306&db=database&table=tablename&code=code&factor=pm25&start=2019-01-01 00:00:00&end=2019-09-30 23:00:00'''if request.method=='GET':host=request.args['host']user=request.args['user']passwd=request.args['passwd']port=request.args['port']db=request.args['db']table=request.args['table']code=request.args['code']factor=request.args['factor']start=request.args['start']end=request.args['end']mysql['host']=hostmysql['user']=usermysql['passwd']=passwdmysql['port']=int(port)mysql['db']=db#数据获取select_sql="SELECT wd,"+factor+" FROM "+table+" where station_code='"+code+"' AND data_time>='"+\start+"' AND data_time<='"+end+"'"#print select_sqldata=selectAllRecords(mysql, select_sql)result=[]for i in range(len(data)):if data[i][0] and data[i][1] and data[i][0]!='None'and data[i][1]!='None':result.append([float(data[i][0]),float(data[i][1])])dd=[float(data[i][0]) for i in range(len(data)) if data[i][0]]ff=[float(data[i][1]) for i in range(len(data)) if data[i][1]]length=min(len(dd),len(ff))wd=windDirectionTransform(dd)title=factor+u"因子风向玫瑰图"pic_path='rosePics/'+code+'_'+factor+'.png'plotPollutionRoseDemo(ff[:length],dd[:length],title,save_path=pic_path)image_data=open(pic_path,"rb").read()response=make_response(image_data)response.headers['Content-Type']='image/png'return response  if __name__ == "__main__":app.run(host=0.0.0.0,port=5000)

完成上述API的开发工作后就可以进行使用分析了,下面是简单的实例测试结果:

基于API实现工具方便的调用对于提升工作效率或者是辅助现场人员完成数据分析工作是很有帮助的。

很高兴在自己温习回顾知识的同时能写下点分享的东西出来,如果说您觉得我的内容还可以或者是对您有所启发、帮助,还希望得到您的鼓励支持!

赞 赏 作 者

Python中文社区作为一个去中心化的全球技术社区,以成为全球20万Python中文开发者的精神部落为愿景,目前覆盖各大主流媒体和协作平台,与阿里、腾讯、百度、微软、亚马逊、开源中国、CSDN等业界知名公司和技术社区建立了广泛的联系,拥有来自十多个国家和地区数万名登记会员,会员来自以工信部、清华大学、北京大学、北京邮电大学、中国人民银行、中科院、中金、华为、BAT、谷歌、微软等为代表的政府机关、科研单位、金融机构以及海内外知名公司,全平台近20万开发者关注。

▼ 点击成为社区注册会员          「在看」一下,一起PY

用 Python 绘制污染物玫瑰图相关推荐

  1. python绘制风向玫瑰图

    一.风向.流向角度和数学角关系. 1.数学角和风向角相互转换. 数学角向东为0°,按照逆时针旋转. 北风为0°,即指向南为0°,顺时针增加 数学角转风向角: (1)根据u,v获得数学角: (2)根据数 ...

  2. python画动图-Python绘制动态水球图过程详解

    先来看看绘制的动态水球图: 没有安装PyEcharts的,先安装PyEcharts: # 安装pyecharts模块,直接安装就是最新的版本pip install pyecharts 安装好PyEch ...

  3. python画折线图显示点值-Python 绘制可视化折线图

    1. 用 Numpy ndarray 作为数据传入 ply import numpy as np import matplotlib as mpl import matplotlib.pyplot a ...

  4. python画折线图代码-python绘制简单折线图代码示例

    1.画最简单的直线图 代码如下: import numpy as np import matplotlib.pyplot as plt x=[0,1] y=[0,1] plt.figure() plt ...

  5. python绘制雷达图代码实例-使用python绘制温度变化雷达图

    本文实例为大家分享了python绘制温度变化雷达图的具体代码,供大家参考,具体内容如下 假设某天某地每三个小时取样的气温为 针对温度变化趋势绘制雷达图: 代码如下: import numpy as n ...

  6. python画折线图详解-python绘制简单折线图代码示例

    1.画最简单的直线图 代码如下: import numpy as np import matplotlib.pyplot as plt x=[0,1] y=[0,1] plt.figure() plt ...

  7. python台风动图绘制_使用Python绘制台风轨迹图的示例代码

    参考: 使用CMA热带气旋最佳路径数据集,对我国周边的台风进行绘制 import re import os import numpy as np import matplotlib.pyplot as ...

  8. python画折线图代码实现_python如何绘制分布折线图 python绘制分布折线图代码示例...

    python如何绘制分布折线图?本篇文章小编给大家分享一下python绘制分布折线图代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 用Pyth ...

  9. python能画k线图吗_,求教使用python绘制K线图

    如何用python实现视频关键帧提取并保存为图片 import cv2 vc = cv2.VideoCapture('Test.avi') #读入视频文件 c=1 if vc.isOpened(): ...

  10. python画简单图-python绘制简单彩虹图

    本文实例为大家分享了python绘制彩虹图的具体代码,供大家参考,具体内容如下 代码: from turtle import * #控制彩虹路径 def path(pen, r, g, b): pen ...

最新文章

  1. JavaScript初学者编程题(22)
  2. 打破国外垄断,我国拿下一项“制芯”关键技术
  3. Java Pinyin4j(汉字转拼音)
  4. python编程课程上课有用吗-朋友圈里的编程课,是 Python 还是成功学?
  5. 线上Bug无法复现怎么办?老司机教你一招,SpringBoot远程调试不用愁!
  6. Factory Method工厂方法模式
  7. KR C、ANSI C、C89、C90、C95、C99 和 C11 的区别联系
  8. PHP里的$_SERVER对象
  9. 大数据|意不意外?今年卖得最好的月饼是这个馅的……
  10. dbms标识符无效_DBMS中的聚合运算符(分组依据和具有子句)
  11. 复杂电路简化经典例题_一天搞定考试系列之电路原理(3)
  12. C++ 一定要使用strcpy_s()函数 等来操作方法c_str()返回的指针
  13. android播放视频功能,android surfaceView实现播放视频功能
  14. Windows电脑上不错的几款图片编辑软件
  15. Java飞机大战项目实战
  16. 20200807-玻璃涨停,隔夜低开,纯碱高开,今天晚上就是空头盛宴,43500了哈哈哈,赚钱了,别做了
  17. 面向法律领域的罪名预测、问题分类与FAQ问答模型设计与实现【NLP】
  18. MYSQL的开题报告题目,开题报告的选题意义.docx
  19. 蚂蚁IPO有人欢呼,也有前员工建群,​群名“错失几千万的人”
  20. rsyslog服务搭建

热门文章

  1. GMSK调制解调器 matlab viterbi解调采用维特比解调性能具有很大优势
  2. 微信小程序开发教程+工具插件
  3. 英特尔核显驱动hd630_技术力井喷!深度解析英特尔11代酷睿处理器
  4. 黑马程序员-java教程 代码笔记
  5. vue3+ts封装echarts
  6. vs201X的TFS(Team Foundation Server) 设置为:不自动签出
  7. 关于软件开发的那些事(三):聊聊软件项目管理及成本核算
  8. php bin2hex park,PHP bin2hex()函数与示例
  9. java堆排序递归代码,无原理版,比较好理解
  10. RtlUnicodeStringToAnsiString中第三个参数引发的bsod