Shiny app graphing NZ CO2 (eqv) emissions from 1990 to 2010 https://shiny.petras.space/Emissions/
rstats
statistics
rshiny
climate-change
new-zealand

app.R 7.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. library(shiny)
  2. library(ggplot2)
  3. library(scales)
  4. library(tidyverse)
  5. library(readxl)
  6. library(shinycssloaders)
  7. library(RColorBrewer)
  8. # Original data from
  9. # https://catalogue.data.govt.nz/dataset/
  10. # new-zealands-energy-outlook/resource/3caad31e-aa96-4c94-8f54-1000518a0690?inner_span=True
  11. # Data loading ----
  12. Emissions.Sector <- read_excel("Emissions1990-2010.xlsx",
  13. sheet = "Sector")
  14. Emissions.Fuel <- read_excel("Emissions1990-2010.xlsx",
  15. sheet = "Fuel")
  16. sectors.a <- unique(Emissions.Sector$Sector)
  17. sectors <- unique(Emissions.Sector$Sector)[-1]
  18. sector.col <- data.frame(Sector=sectors.a,
  19. col=brewer.pal(length(sectors.a), "Set3"))
  20. Emissions.Sector <- left_join(Emissions.Sector, sector.col) %>%
  21. mutate(col = as.character(col))
  22. Sector.Tot <- filter(Emissions.Sector, Source == "Total")
  23. Emissions.Fuel <- cbind(Emissions.Fuel,
  24. col=brewer.pal(nrow(Emissions.Fuel), "Set2")) %>%
  25. mutate(col=as.character(col))
  26. fuels <- Emissions.Fuel$Fuel
  27. # gather(comf, key="Year", value="Co2eqv", as.character(1990:2010))
  28. Sector.Fuels <- function(sector) {
  29. sf <- filter(Emissions.Sector, Sector == sector)
  30. if (nrow(sf) > 1) {
  31. sf <- filter(sf, !grepl("Total", Source))
  32. }
  33. return(sf)
  34. }
  35. # UI ----
  36. ui <- navbarPage("NZ Emissions", collapsible = TRUE,
  37. # Sector tab ----
  38. tabPanel("By sector",
  39. h3("Emissions by sector"),
  40. plotOutput("secPlot") %>% withSpinner(type=5),
  41. fluidRow(
  42. column(5, offset=1,
  43. h4("Options"),
  44. sliderInput("secyears", "Date range",
  45. min=1990, max=2010, value=c(1990, 2010),
  46. sep="", step=1),
  47. selectInput("secscale", "Scale",
  48. choices=c("y", "sqrt(y)", "log10(y)"), selected="y"),
  49. checkboxInput("seclegend", "Show legend", value=TRUE),
  50. checkboxInput("secminc", "Set minimum", value=FALSE),
  51. conditionalPanel("input.secminc",
  52. numericInput("secmin", label=NULL, value=NA)),
  53. checkboxInput("secmaxc", "Set maximum", value=FALSE),
  54. conditionalPanel("input.secmaxc",
  55. numericInput("secmax", label=NULL, value=NA))
  56. ),
  57. column(5, offset=1,
  58. h4("Sectors"),
  59. checkboxGroupInput("secSectors", NULL,
  60. choices=sectors.a, selected = sectors.a)
  61. )
  62. )
  63. ),
  64. # Fuel tab ----
  65. tabPanel("By fuel",
  66. h3("Emissions by fuel"),
  67. plotOutput("fuPlot") %>% withSpinner(type=5),
  68. fluidRow(
  69. column(5, offset=1,
  70. h4("Options"),
  71. sliderInput("fuyears", "Date range",
  72. min=1990, max=2010, value=c(1990, 2010),
  73. sep="", step=1),
  74. selectInput("fuscale", "Scale",
  75. choices=c("y", "sqrt(y)", "log10(y)"), selected="y"),
  76. checkboxInput("fulegend", "Show legend", value=TRUE),
  77. checkboxInput("fuminc", "Set minimum", value=FALSE),
  78. conditionalPanel("input.fuminc",
  79. numericInput("fumin", label=NULL, value=NA)),
  80. checkboxInput("fumaxc", "Set maximum", value=FALSE),
  81. conditionalPanel("input.fumaxc",
  82. numericInput("fumax", label=NULL, value=NA))
  83. ),
  84. column(5, offset=1,
  85. h4("Fuels"),
  86. checkboxGroupInput("fuFuels", NULL,
  87. choices=fuels, selected = fuels)
  88. )
  89. )
  90. )
  91. )
  92. server <- function(input, output) {
  93. # Sector logic ----
  94. SecOverall <- reactive({
  95. st <- gather(Sector.Tot, key="Year",
  96. value="Co2eqv", as.character(1990:2010)) %>%
  97. mutate(Year = as.integer(Year),
  98. Sector = factor(Sector, levels=unique(Sector))) %>%
  99. # Logic for filtering out years, sectors here
  100. filter(Year %in% input$secyears[1]:input$secyears[2],
  101. Sector %in% input$secSectors) %>%
  102. mutate(Year = as.Date(paste0(Year, "-01-01")))
  103. return(st)
  104. })
  105. # Sector plot ----
  106. output$secPlot <- renderPlot({
  107. sov <- SecOverall()
  108. if (input$secyears[1] != input$secyears[2]) {
  109. ggplot(sov, aes(x=Year,
  110. y=Co2eqv, color=Sector)) -> s.p
  111. s.p + geom_line(size=1.5, na.rm=TRUE) -> s.p
  112. s.p + theme_linedraw() -> s.p
  113. s.p + scale_color_manual(values=unique(sov$col)) -> s.p
  114. } else {
  115. ggplot(sov, aes(x=Sector,
  116. y=Co2eqv, fill=Sector)) -> s.p
  117. s.p + geom_col(na.rm=TRUE) -> s.p
  118. s.p + theme_linedraw() -> s.p
  119. s.p + theme(axis.text.x = element_text(
  120. angle = -30, hjust = 0, vjust = 0)) -> s.p
  121. s.p + scale_fill_manual(values=unique(sov$col)) -> s.p
  122. }
  123. s.p + guides(linetype=guide_legend(keywidth = 5)) -> s.p
  124. s.p + theme(legend.position = "right",
  125. legend.title = element_blank()) -> s.p
  126. s.p + ylab("CO₂ equivalent (kt)") -> s.p
  127. if (!input$seclegend) {
  128. s.p + theme(legend.position="none") -> s.p
  129. }
  130. mmx <- c(ifelse(input$secminc, input$secmin, NA),
  131. ifelse(input$secmaxc, input$secmax, NA))
  132. if (input$secscale == "sqrt(y)") {
  133. s.p + scale_y_sqrt(breaks=pretty_breaks(n=5), limits=mmx) -> s.p
  134. } else if (input$secscale == "log10(y)") {
  135. s.p + scale_y_log10(breaks=pretty_breaks(n=5), limits=mmx) -> s.p
  136. } else {
  137. s.p + scale_y_continuous(breaks=pretty_breaks(n=5), limits=mmx) -> s.p
  138. }
  139. return(s.p)
  140. })
  141. # Fuel logic ----
  142. FuOverall <- reactive({
  143. st <- gather(Emissions.Fuel, key="Year",
  144. value="Co2eqv", as.character(1990:2010)) %>%
  145. mutate(Year = as.integer(Year),
  146. Fuel = factor(Fuel, levels=unique(Fuel))) %>%
  147. # Logic for filtering out years, fuels here
  148. filter(Year %in% input$fuyears[1]:input$fuyears[2],
  149. Fuel %in% input$fuFuels) %>%
  150. mutate(Year = as.Date(paste0(Year, "-01-01")))
  151. return(st)
  152. })
  153. # Fuel plot ----
  154. output$fuPlot <- renderPlot({
  155. fov <- FuOverall()
  156. if (input$fuyears[1] != input$fuyears[2]) {
  157. ggplot(fov, aes(x=Year,
  158. y=Co2eqv, color=Fuel)) -> f.p
  159. f.p + geom_line(size=1.5, na.rm=TRUE) -> f.p
  160. f.p + theme_linedraw() -> f.p
  161. f.p + scale_color_manual(values=unique(fov$col)) -> f.p
  162. } else {
  163. ggplot(fov, aes(x=Fuel,
  164. y=Co2eqv, fill=Fuel)) -> f.p
  165. f.p + geom_col(na.rm=TRUE) -> f.p
  166. f.p + theme_linedraw() -> f.p
  167. f.p + theme(axis.text.x = element_text(
  168. angle = -30, hjust = 0, vjust = 0)) -> f.p
  169. f.p + scale_fill_manual(values=unique(fov$col)) -> f.p
  170. }
  171. f.p + guides(linetype=guide_legend(keywidth = 5)) -> f.p
  172. f.p + theme(legend.position = "right",
  173. legend.title = element_blank()) -> f.p
  174. f.p + ylab("CO₂ equivalent (kt)") -> f.p
  175. if (!input$fulegend) {
  176. f.p + theme(legend.position="none") -> f.p
  177. }
  178. mmx <- c(ifelse(input$fuminc, input$fumin, NA),
  179. ifelse(input$fumaxc, input$fumax, NA))
  180. if (input$fuscale == "sqrt(y)") {
  181. f.p + scale_y_sqrt(breaks=pretty_breaks(n=5), limits=mmx) -> f.p
  182. } else if (input$fuscale == "log10(y)") {
  183. f.p + scale_y_log10(breaks=pretty_breaks(n=5), limits=mmx) -> f.p
  184. } else {
  185. f.p + scale_y_continuous(breaks=pretty_breaks(n=5), limits=mmx) -> f.p
  186. }
  187. return(f.p)
  188. })
  189. }
  190. shinyApp(ui = ui, server = server)