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.3KB

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