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 6.4KB

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