作者:沂水寒城,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))
plt.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服務是比較常用的做法,這裡的具體代碼實現如下:
import 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']=host
mysql['user']=user
mysql['passwd']=passwd
mysql['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+"'"
data=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