應用統計子主題F

動機

  • 因為我鼻子過敏,所以需要了解台灣各地的空氣品質

程式說明

  • 載入必要套件,轉換資料格式為data.frame
rm(list=ls(all=TRUE))

library(readr)
library(leaflet)


#命名為data將格式改成dataframe
data = read_csv("https://data.moenv.gov.tw/api/v2/aqx_p_432?api_key=e8dd42e6-9b8b-43f8-991e-b3dee723a52d&limit=1000&sort=ImportDate%20desc&format=CSV")
data = as.data.frame(data)
  • 將colname改變名稱,後取需要的指標就好
colnames(data)=c('測站名稱','縣市','空氣品質指標','空氣污染指標物','狀態','二氧化硫(ppb)',
                 '一氧化碳(ppm)','臭氧(ppb)','臭氧8小時移動平均(ppb)','pm10','pm2.5','二氧化氮(ppb)',
                 '氮氧化物(ppb)','一氧化氮(ppb)','風速(m/sec)',
                 '風向','資料發布時間','一氧化碳8小時移動平均(ppm)',
                 'pm2.5_avg','pm10_avg','二氧化硫移動平均值(ppb)',
                 '經度','緯度','測站編號')

cols=c('測站名稱','縣市','空氣品質指標','空氣污染指標物','狀態','二氧化硫(ppb)',
       '一氧化碳(ppm)','臭氧(ppb)','pm10','pm2.5','二氧化氮(ppb)',
       '氮氧化物(ppb)','一氧化氮(ppb)','風速(m/sec)',
       '風向','資料發布時間','經度','緯度','測站編號')
data=data[cols]
  • 將各個字串使用paste0連接再一起
  • 創建一個Leaflet地圖,並使用addTiles()添加底圖,addCircles()則是根據提供的經緯度,在地圖上添加標記,並將popup的內容家在彈出窗口
data$popup = paste0("測站名稱:", data$地點, "<br>",
                    "縣市:", data$縣市, "<br>",
                    "空氣品質指標:", data$空氣品質指標, "<br>",
                    "空氣汙染指標物:", data$空氣汙染指標物, "<br>",
                    "狀態:", data$狀態, "<br>",
                    "二氧化硫(ppb):", data$"二氧化硫(ppb)", "<br>",
                    "一氧化碳(ppm):", data$"一氧化碳(ppm)", "<br>",
                    "臭氧:", data$"臭氧(ppb)", "<br>",
                    "pm10:", data$pm10, "<br>",
                    "pm2.5:", data$"pm2.5", "<br>",
                    "二氧化氮(ppb):", data$"二氧化氮(ppb)", "<br>",
                    "氮氧化物(ppb):", data$"氮氧化物(ppb)", "<br>",
                    "一氧化氮(ppb):", data$"一氧化氮(ppb)", "<br>",
                    "風速(m/sec):", data$"風速(m/sec)", "<br>",
                    "風向:", data$"風向", "<br>",
                    "資料發布時間:", data$資料發布時間, "<br>",
                    "測站編號:", data$測站編號)

map1 = leaflet() %>%
  addTiles() %>%
  # 使用 addTiles() 函數添加 tiles,
  # 並使用默認參數默認即是 OpenStreetMap,
  # 即街區 Tiles。
  addCircles(data=data, 
             lng=~經度, 
             lat=~緯度, 
             popup=~popup)
  • 將狀態良好、普通、對敏感族群不健康換成數值1,2,3
#將狀態良好、普通、對敏感族群不健康換成數值1,2,3
#使用狀態變數來建立顏色區間
#colorBin函數來定義一個顏色對應的物件,palette是用於指定對應顏色的調色盤,bin是用於指定調色盤的分段數
data$狀態_n <- factor(data$狀態, levels=c("良好", "普通", "對敏感族群不健康"), labels=c(1, 2, 3))
data$狀態_n <- as.numeric(data$狀態_n)

pal_狀態 = leaflet::colorBin(palette=c("blue", "red", "green"), 
                           domain=data$狀態_n, 
                           bins=3)
  • 地圖map2根據狀態_n的值使用調色盤來設置標記的顏色
map2 = leaflet() %>%
  addTiles() %>%
  addCircles(data=data, 
             lng=~經度, 
             lat=~緯度,
             radius=2,
             color=~pal_狀態(狀態_n),
             fillOpacity=1,
             popup=~popup)
  • 創建一個towns_color利用縣市的唯一值對應顏色,topo.colors()根據縣市數量生成一系列的顏色
#alpha設置顏色透明度topo.colors()根據縣市數量生成一系列的顏色
#leaflet::colorFactor是創建顏色因子
alpha = 0.9
towns_color = data.frame("town"=unique(data$縣市),
                         "color"=topo.colors(length(unique(data$縣市)), alpha=alpha))
pal_地區 = leaflet::colorFactor(palette=towns_color$color, 
                              domain=towns_color$town)
map3 = leaflet() %>% 
  addTiles() %>%
  addCircles(data=data,
             lng=~經度,
             lat=~緯度,
             color=~pal_地區(縣市),
             radius=2,
             fillOpacity=alpha, 
             popup=~popup) %>%
  addLegend(position="topright", pal=pal_地區, values=data$縣市)
  • 寫入png圖像的函數將儲存在電腦中的logo路徑寫入
#png套件將儲存在電腦中的logo路徑寫入

library(png)
logo="C:/unep-aqms-logo.png"
icon = leaflet::makeIcon(logo,
                         iconWidth=12,
                         iconHeight=12)
map4 = leaflet() %>% 
  addTiles() %>%
  addMarkers(data=data, 
             lng=~經度,
             lat=~緯度,
             icon=icon,
             popup=~popup)

logo = "C:/unep-aqms-logo.png"
icon = leaflet::makeIcon(logo,
                         iconWidth=12,
                         iconHeight=12)
  • (群聚地理資訊地圖)
#clusterOptions=markerClusterOptions()將相鄰的標記點組合成聚類群組
map5 = leaflet() %>% 
  addTiles() %>%
  addMarkers(data=data, 
             lng=~經度, 
             lat=~緯度, 
             icon=icon,
             popup=~popup,
             clusterOptions=markerClusterOptions())
  • 繪圖
map1
map2
map3
map4
map5

結論

  • map1上的藍點是臺灣所有空氣觀測站,每個點會顯示測站資料以及空氣品質
  • map2代表著空氣的品質,藍色是良好,綠色是普通,紅色是不好
  • map3依所在位置的縣市分類,由地圖上點的顏色可以知道那個測站在哪
  • map4將測站所在地圖上用圖標標示
  • map5是聚類功能地圖