熱圖簡言之就是將數值的大小用顏色深淺來呈現,將量化數據透過視覺化的方式傳遞,讓閱讀者可以快速獲取資訊。
在這基本概念下利用python的Plotly套件來繪製熱圖。這次以2019年1月到8月空氣品質數據為例做二維圖表的熱圖(資料來源為環保署的監測網)。
空氣品質議題受到全球關注:
隨著科技發展的同時,環境相關的議題也受到國際重視,包含空氣品質對於健康之衝擊等議題,其中以PM2.5對健康的影響最為受到關注。唯影響空氣品質的因素複雜,需立基於全球觀點共同探討空氣汙染、氣候改變對健康的衝擊,因此探討對於健康之影響並非本篇著墨的重點。空氣品質的議題固然龐大,基於民眾的立場,我們應該具備基礎認知以及對生活環境的關注,以因應大環境的變化。
即時空氣品質指標(AQI)
空氣品質指標(AQI)是描述空氣品質的指數,全世界並沒有針對這個指標有一致的規定,各國可以依據不同的情況調整,制定適合的空氣指標,因此不同國家會有不同的AQI指標,例如加拿大與美國AQI指標就不太一樣。但指標都有一致共通點,當指標數值越高皆表示空氣品質越差。
目前臺灣環保署所採用的即時空氣品質指標(AQI)則是參考美國環境保護署標準而制定。
加拿大空氣品質指標
(參考來源:加拿大政府網站)
美國空氣品質指標
(參考來源:美國環境保護署)
臺灣空氣品質指標
臺灣環保署偵測O3、PM2.5、PM10、CO、SO2、 NO2等6個測項之即時副指標值,各副指標皆有不同的濃度計算方式,有興趣的人可連結至臺灣環保署網站查詢(https://taqm.epa.gov.tw/taqm/tw/b0203.aspx),計算後的濃度值對應到「污染物濃度與即時副指標值對照表」,取其中最大值為即時空氣品質指標,該汙染物則為指標污染物。
空氣品質監測資源
除了這些網站外,手機上也有許多的空氣品質即時資料的App可以提供下載,讓民眾可以隨時掌握最即時的資訊,做好初步防範。
操作步驟
1.選定主題,準備素材
以2019年1月至8月測站測得AQI>100之天數資料(資料來源為整理環保署的監測網開放資料),因各月份基本天數不同,再將取得的天數資料除以該月份天數轉換成百分比,也就是每個測站測得AQI>100的天數佔該月的多少百分比。假定數值為50,表示該月有一半天數出現AQI>100(對敏感族群不健康)的情況。但測站數量較多,因此僅取幾個測站資料做呈現。
2.確認繪圖需要用到的參數:
X軸(x):月(month)
Y軸(y):各測站
3.繪製熱圖
這邊要說明一下報表數值的部份是由Z參數採用矩陣的方式帶入,帶入的規則演示如下:
- import plotly.graph_objs as go
- import plotly.offline as py
- x=["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月"]
- y=["基隆-基隆測站","臺北-中山測站","新北-板橋測站","桃園-桃園測站","新竹-新竹測站","苗栗-苗栗測站","臺中-豐原測站","南投-南投測站",
- "彰化-彰化測站","雲林-斗六測站","嘉義-嘉義測站","臺南-臺南測站","高雄-前金測站","屏東-屏東測站"]
- z=[df["ID_1"],df["ID_2"],df["ID_3"],df["ID_4"],df["ID_5"],df["ID_6"],df["ID_7"],df["ID_8"],df["ID_9"],df["ID_10"],df["ID_11"],df["ID_12"],df["ID_13"],df["ID_14"]] #z為矩陣
- annotations = go.Annotations()
- for n, row in enumerate(z):
- for m, val in enumerate(row):
- annotations.append(go.Annotation(text=str(z[n][m]), x=x[m], y=y[n],
- xref='x1', yref='y1', showarrow=False)) #讓熱圖畫面可以直接代入數據
- colorscale=[[0.0, '#5DAC81'],[0.3, '#A8D8B9'], [0.5, '#EEA9A9'], [0.7,"#EB7A77"],[1.0, '#CB4042']] #除了選擇plotly提供的現成設定外,可以自行做顏色設定
- trace=go.Heatmap(x=x,y=y,z=z,
- colorscale=colorscale)
- fig = go.Figure(data=go.Data([trace]))
- fig['layout'].update(
- title="2019年1月至8月AQI>100天數佔該月份之百分比(%)",
- annotations=annotations,
- xaxis=go.XAxis(ticks='', side='top'),
- yaxis=go.YAxis(ticks='', ticksuffix=' '), # ticksuffix is a workaround to add a bit of padding
- width=1200,
- height=700,
- margin=go.Margin(
- l=150,
- r=160,
- b=50,
- t=100,
- pad=3
- ),
- autosize=False
- )
- plot(fig, config={"displayModeBar": False}, show_link=False,filename='basic-heatmap')
留言
張貼留言