library(rvest)
library(lubridate)
library(dplyr)
library(ggplot2)
library(gridExtra)
setwd("~/RProjects/jakosc_powietrza")
# czy dane ze strony czy z przygotowanego pliku?
online <- FALSE
# ile ostatnich dni wczytać?
ile_dni <- 1095 # 3 lata
if(online == TRUE) {
# wczytaj dane ze strony
# dzisiaj
dzis <- Sys.Date()
dzis <- make_date(year(dzis), month(dzis), day(dzis))
# dane bazowe
sojp_base_url <- "http://sojp.wios.warszawa.pl/?page=raport-dobowy&data="
dane_dobowe <- data.frame()
# pobieraj kolejne dni
for(i in 1:ile_dni) {
# progress bar :)
cat(paste("\rPobieram dane:", i, "/", ile_dni, "\r"))
# kolejne dni wstecz, począwszy od wczoraj
dzien <- dzis-ddays(i)
# przygotowanie urla dla konkretnej daty
strona <- read_html(paste0(sojp_base_url, format(dzien, "%d-%m-%Y")))
# pobranie danych do tabeli
df <- strona %>% html_node("table") %>% html_table(fill=TRUE)
# w pierwszym wierszu danych tabeli są jednostki - usuwamy
df <- df[-1,]
# konwersja na liczby
for(j in 2:13) {
df[,j] <- as.numeric(df[,j])
}
# dodajemy datę pomiaru
df <- cbind(df, data=dzien)
# porządek w nazwach kolumn - jednostki µg/m3 + %LV (% dopuszczalnego w Polsce poziomu)
colnames(df) <- c("Stacja", "PM10", "PM10_pLV", "NO2", "NO2_pLV",
"CO", "CO_pLV", "O3", "O3_pLV", "SO2_S1", "SO2_S1_pLV",
"SO2_S24", "SO2_S24_pLV", "Data")
# scalenie ze wszystkimi
dane_dobowe <- rbind(dane_dobowe, df)
}
# trafiają się wiersze puste - z pustą nazwą stacji -> usuwamy
dane_dobowe <- dane_dobowe[nchar(dane_dobowe$Stacja)!=0,]
# zmiana wartości liczbowych na opisowe
# skale zgodne z opisem na http://sojp.wios.warszawa.pl/
dane_dobowe$PM10_jakosc <- cut(dane_dobowe$PM10,
breaks = c(0,20,60,100,140,200,1e+6),
labels = c("Bardzo dobry", "Dobry", "Umiarkowany", "Dostateczny", "Zły", "Bardzo zły"))
dane_dobowe$NO2_jakosc <- cut(dane_dobowe$NO2,
breaks = c(0,40,100,150,200,400,1e+6),
labels = c("Bardzo dobry", "Dobry", "Umiarkowany", "Dostateczny", "Zły", "Bardzo zły"))
dane_dobowe$CO_jakosc <- cut(dane_dobowe$CO,
breaks = c(0,2,6,10,15,20,1e+6),
labels = c("Bardzo dobry", "Dobry", "Umiarkowany", "Dostateczny", "Zły", "Bardzo zły"))
dane_dobowe$O3_jakosc <- cut(dane_dobowe$O3,
breaks = c(0,30,70,120,160,240,1e+6),
labels = c("Bardzo dobry", "Dobry", "Umiarkowany", "Dostateczny", "Zły", "Bardzo zły"))
dane_dobowe$SO2_S1_jakosc <- cut(dane_dobowe$SO2_S1,
breaks = c(0,50,100,200,350,500,1e+6),
labels = c("Bardzo dobry", "Dobry", "Umiarkowany", "Dostateczny", "Zły", "Bardzo zły"))
dane_dobowe$SO2_S24_jakosc <- cut(dane_dobowe$SO2_S24,
breaks = c(0,5,10,15,20,50,1e+6),
labels = c("Bardzo dobry", "Dobry", "Umiarkowany", "Dostateczny", "Zły", "Bardzo zły"))
# zapisanie danych do pliku - na wszelki wypadek,
# żeby nie pobierać za każdym razem w przyszłości
save(dane_dobowe, file="dane_dobowe.Rdata")
} else {
# wczytaj dane z pliku
load("dane_dobowe.Rdata")
}
# lista wszystkich stacji
stacje <- unique(dane_dobowe$Stacja)
print(stacje)
| 1 |
Belsk-IGFPAN |
| 2 |
Granica-KPN |
| 3 |
Guty Duże |
| 4 |
Legionowo-Zegrzyńska |
| 5 |
Otwock-Brzozowa |
| 6 |
Piastów-Pułaskiego |
| 7 |
Płock-Reja |
| 8 |
Płock-Gimnazjum |
| 9 |
Radom-Tochtermana |
| 10 |
Siedlce-Konarskiego |
| 11 |
Warszawa-Komunikacyjna |
| 12 |
Warszawa-Marszałkowska |
| 13 |
Warszawa-Podleśna |
| 14 |
Warszawa-Targówek |
| 15 |
Warszawa-Ursynów |
| 16 |
Żyrardów-Roosevelta |
# wybrana stacja
stacja <- "Warszawa-Targówek"
wykres <- function(dane, wybrana_stacja, wskaznik_nazwa, wskaznik_jakosc, tytul) {
# funkcja przygotowuje wykres - na podstawie wskazanego wskaźnika, z podanym tytułem
# pomocnicze dane
dane_df <- data.frame(Data=dane$Data,
Stacja=dane$Stacja,
wskaznik=dane[[wskaznik_nazwa]],
wskaznik_jakosc=dane[[wskaznik_jakosc]])
# jeśli są dane - narysuj wykres
# jeśli nie ma - zrób zaślepkę
if(dane_df %>% filter(Stacja==wybrana_stacja, !is.na(wskaznik)) %>% nrow() != 0) {
p <- dane_df %>%
filter(Stacja==stacja, !is.na(wskaznik)) %>%
ggplot() +
geom_point(aes(Data, wskaznik, color=wskaznik_jakosc)) +
theme_minimal() +
labs(title=tytul, x="Data", y=wskaznik_nazwa, colour="Jakość") +
ylim(0,max(dane_df$wskaznik, na.rm = TRUE)) +
scale_color_brewer(palette="Set1", direction = -1)
} else {
p <- ggplot() +
theme_minimal() +
labs(title=paste0(tytul, "\n\nBRAK DANYCH ZE STACJI"))
}
return(p)
}
# przygotowanie wykresów wszystkich wskaźników
p1 <- wykres(dane_dobowe, stacja, "NO2_pLV", "NO2_jakosc", "NO2 - maksymalna średnia 1h")
p2 <- wykres(dane_dobowe, stacja, "PM10_pLV", "PM10_jakosc", "Pył zawieszony PM10 - średnia 24h")
p3 <- wykres(dane_dobowe, stacja, "CO_pLV", "CO_jakosc", "CO - maksymalna średnia 8")
p4 <- wykres(dane_dobowe, stacja, "O3_pLV", "O3_jakosc", "O3 - maksymalna średnia 8h")
p5 <- wykres(dane_dobowe, stacja, "SO2_S1_pLV", "SO2_S1_jakosc", "SO2 - maksymalna średnia 1h")
p6 <- wykres(dane_dobowe, stacja, "SO2_S24_pLV", "SO2_S24_jakosc", "SO2 - średnia 24h")
# wszystkie wykresy na raz - prezentacja
grid.arrange(p1, p2, p3, p4, p5, p6,
top=paste("Procent dopuszczalnej normy dla wskaźników\nna stacji", stacja))
