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

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