用 Python 繪製汙染物玫瑰圖

2021-03-01 Python中文社區

作者:沂水寒城,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

相關焦點

  • 用Python畫朵玫瑰,只要五分鐘
    最近一個項目在用python,想著這次不用java了,用python給媽媽個禮物吧。Turtle庫是Python語言中一個非常強大的繪製圖像的函數庫,她提供了很多強大的方法,可以方便快速的繪圖,今天我們就來試一下,畫朵玫瑰送給媽媽。首先大家可以先去了解下turtle的具體用法,半小時就可上手,具體可以參考我之前的文章輕鬆搞定Python繪圖,就是這麼簡單。
  • python 基於opencv 繪製圖像輪廓
    這篇文章主要介紹了python 基於opencv 繪製圖像輪廓的示例,幫助大家更好的利用python的opencv庫處理圖像,感興趣的朋友可以了解下
  • Python|| proplot 中國地圖白化繪製
    看過很多大佬繪製過中國地圖,有R-ggplot[1]的,也有python-geopandas[2]等,還有其他cartopy等的作圖包,我就不一一舉例了
  • python使用matplotlib畫動態圖
    matplotlib是python的核心繪圖庫,是python的一個開源項目,旨在為python提供一個繪圖庫。matplotlib與numpy組合是一種可行的matlab替代方案。下面我們就來聊一聊如何使用matplotlib繪製一個二維動態圖。
  • 新一線城市競爭力盤點,用Python繪製動態圖帶你看懂!
    今天我們就來用數據全面解讀這15座城市。這次我們使用Python的動態可視化庫plotly,對這15座城市從2000年到2019年這20年的GDP、人口以及房價數據進行了可視化。下面就讓我們來一起看看吧!
  • Python數據可視化:氣泡圖的3種畫法
    ,Matplotlib用ax.scatter畫散點圖。10*a+20*b, 2), c=np.random.rand(100),cmap=mpl.cm.RdYlBu, marker="o")plt.show() Bokeh繪製氣泡圖
  • 還在煩惱用python在同一圖裡畫多數據曲線嗎?教你6種姿勢搞定
    概要:python的matplotlib作圖很強大,本文教你用6種不同方式解決將多種數據曲線畫到一起。問題:今天,老闆又要一個數據報表,小明選擇用 python來實現。「用matplotlib用來可視化。並且必須用不同顏色標誌每個數據曲線,曲線這些顏色也應該在Python裡自動選擇。」
  • Python學習筆記:繪製虛線圖和認識線的類型
    1.自己設定的虛線圖import numpy as npimport matplotlib.pyplot as plt#x軸數值區間是0到10,800個點x=np.linspace(0,10,800)#設置接下來將要繪製的曲線的點參數# 20個點出現,5個點隱藏,50個點出現,20個點隱藏(感覺可以設置自己想要的虛線)dashes=[20,5,50,20]#繪製圖紙
  • 用Python製作一個貓咪小秒表
    要實現這樣的效果,用python就足夠了。主要用到的就是matplotlib包。首先,下載貓咪的gif圖,然後將gif圖切分成多張png圖。每一幀都用一張上文生成的不同的png圖片,遍歷完png圖片之後,再繼續循環往復。不難看出,原始gif中的貓耳朵是向左的,如果改成向上的,看著要舒服一些。這就需要將圖片沿著斜45度角進行旋轉。
  • 不再羨慕別人的漂亮圖表,一文學會如何用Python繪製堆積圖
    首先,用matplotlib庫的bar()函數繪製堆積柱狀圖哦bar()函數作為matplotlib庫的專用柱狀圖繪製函數,相信大家已經熟悉它的調用方式了哦,現在咱們就看看如何繪製堆積柱狀圖吧!好啦,說完了堆積柱狀圖,咱們再深入聊一點,來看一下堆積柱狀圖的變體吧,如何繪製堆積條形圖哦!
  • 一文學會用Python繪製經典的棉棒圖、箱線圖和誤差棒圖
    這幾天一直在和大家聊Python數據可視化相關的東東,其中呢,介紹最多的當然是matplotlib庫中的各種繪製函數啦,上次已經和大家談論了關於Python中如何繪製氣泡圖等漂亮圖表的方式,今天呢,咱們繼續聊哦,今天呢,咱們就來聊聊如何繪製經典的棉棒圖、箱線圖和誤差棒圖
  • 非分裂式餅圖你會繪製嗎?一文學會如何用Python搞定
    ()函數來繪製分裂式餅圖,今天呢,咱們繼續深入介紹一下餅圖的繪製!那今天咱們來介紹餅圖的那些內容呢?就來說一下如何繪製非分裂式餅圖吧!其實在Python中繪製非分裂式餅圖與上次咱們介紹的繪製分裂式餅圖用的是同一個函數,依然是pie()函數,唯一的區別只是pie()函數中的參數設置不同!
  • 統計圖形自己就可搞定,一文學會用Python繪製經典餅圖
    餅圖,應該是大家比較熟悉的圖形了吧,作為用來展示定性數據比例分布特徵的經典統計圖形,通過餅圖,你可以很直觀地看到各組數據的佔比情況哦,上次已經和大家探討了如何用Python來繪製經典的階梯圖,今天呢,咱們繼續深入聊聊哦,看看在Python中如何繪製更為經典和常用的餅圖
  • 用Python畫時間線圖有多簡單
    今天,就簡單分享一個用pyecharts製作時間線圖的例子,實現非常簡單,效果卻很強大。pyecharts是python對百度開源echarts框架的一個封裝,接口豐富、設置多樣、圖表可交互。需要指出的是,pyecharts從0.5版本升級到1.0版本後,接口調用形式發生很大變化,一度令人感到陌生,但實際上只是傳參方式有些不同而已。
  • Python-matplotlib 多子圖共用colorbar
    matplotlib 繪製教程後,有小夥伴反應能否出一篇多子圖共用一個colorbar的系列教程,這裡也就使用自己的數據進行繪製(數據一共四列,具體為真實值和使用三個模型計算的預測值)。在繪製多子圖共用colorbar時,最重要的就是對顏色映射進行設置,這裡使用了matplotlib.color.Normalize()進行顏色和數值對應設置。先看一下使用默認設置的結果,每個子圖對應一個colorbar。
  • Python用PyQt5繪製多彩隨機散點圖,基本控制項之QPainter使用詳解
    回顧下精彩內容Python用PyQt5製作顏色對話框,PyQt圖形界面編程之QColorDialogQt圖形界面編程之QFileDialog類,Python用PyQt5製作文件對話框Qt圖形界面編程之QFileDialog類,Python用PyQt5製作文件對話框如何通過Qt界面設置字體屬性,Python中PyQt5的QFontDialog類詳解Python用PyQt5製作彈出式輸入框,Qt圖形界面編程之QInputDialog今天,我們來詳細了解下PyQt5中的一個繪圖類QPainter類。
  • 想用Python做數據可視化?先邁過這個「坎」
    python的人都會面臨一個問題,尤其是初學者:我應該選哪個來實現數據可視化? 這就是今天分享這篇文章的初衷,通過列舉一些使用頻率較高的工具,以及使用它們創建簡單的條形圖的方法,幫助各位進行簡單的梳理。
  • 基於Python生成鉛筆素描圖
    >爬蟲技術分析代碼解析後記前言說到鉛筆素描,很多畫家用它用的極為精湛。阿廣醜照圖鉛筆素描圖爬蟲技術分析PIL庫:PIL(Python Image Library)是python的第三方圖像處理庫,但是由於其強大的功能與眾多的使用人數,幾乎已經被認為是python官方圖像處理庫了。其官方主頁為:PIL。
  • Python實現手繪效果的cute圖表
    之前我們經常在案例中使用 matplotlib 繪製圖表,比如:也介紹過如何用
  • python圖像處理-gif動圖
    圖片合成動圖導入os庫,利用listdir方法將lion文件夾中的圖片全部讀取出來,循環打開每一張圖片,接著將圖片對象添加到frames列表中,最後利用save方法,保存為一張動圖。動圖分解成一張張圖片先使用open方法打開動圖,接著使用ImageSequence將打開的圖片對象轉換成可迭代的圖片序列,通過for循環將圖片一張張保存到本地,名字可以自定義。