Skip to contents

Stations

General overview

# install.packages("remotes")
# remotes::install_github("kwb-r/wasserportal", upgrade = "never", force = TRUE)
library(wasserportal)
overview_options <- wasserportal::get_overview_options()
str(overview_options)
#> List of 2
#>  $ surface_water:List of 7
#>   ..$ water_level         : chr "ws"
#>   ..$ flow                : chr "df"
#>   ..$ temperature         : chr "wt"
#>   ..$ conductivity        : chr "lf"
#>   ..$ ph                  : chr "ph"
#>   ..$ oxygen_concentration: chr "og"
#>   ..$ oxygen_saturation   : chr "os"
#>  $ groundwater  :List of 2
#>   ..$ level  : chr "gws"
#>   ..$ quality: chr "gwq"

system.time(stations <- wasserportal::get_stations())
#> Importing 9 station overviews from Wasserportal Berlin ... ok. (5.58s)
#>    user  system elapsed 
#>   0.068   0.014   5.948

str(stations)
#> List of 3
#>  $ overview_list:List of 9
#>   ..$ surface_water.water_level         : tibble [73 × 9] (S3: tbl_df/tbl/data.frame)
#>   .. ..$ Messstellennummer: int [1:73] 5865900 5870400 5865300 5819900 5864801 5861101 5800107 5800317 5867003 5867401 ...
#>   .. ..$ Messstellenname  : chr [1:73] "Allee der Kosmonauten" "Alsenbrücke" "Am Bahndamm" "Am Freibad" ...
#>   .. ..$ Gewaesser        : chr [1:73] "M.-H.-Grenzgr." "Griebnitzkanal" "Wuhle" "Tegeler Fließ" ...
#>   .. ..$ Betreiber        : chr [1:73] "Land Berlin" "Land Berlin" "Land Berlin" "Land Berlin" ...
#>   .. ..$ Datum            : chr [1:73] "08.08.2022 06:00" "08.08.2022 06:00" "08.08.2022 06:00" "08.08.2022 06:00" ...
#>   .. ..$ Wasserstand      : int [1:73] 0 48 90 50 3 24 67 73 90 37 ...
#>   .. ..$ Einheit          : chr [1:73] "cm" "cm" "cm" "cm" ...
#>   .. ..$ Ganglinien       : logi [1:73] NA NA NA NA NA NA ...
#>   .. ..$ Klassifikation   : chr [1:73] "niedrig" "niedrig" "niedrig" "niedrig" ...
#>   ..$ surface_water.flow                : tibble [16 × 9] (S3: tbl_df/tbl/data.frame)
#>   .. ..$ Messstellennummer: int [1:16] 5870400 5865300 5864801 5867401 5867900 5827101 5870100 5826701 5862811 5827700 ...
#>   .. ..$ Messstellenname  : chr [1:16] "Alsenbrücke" "Am Bahndamm" "Am Kienberg" "Bürgerpark" ...
#>   .. ..$ Gewaesser        : chr [1:16] "Griebnitzkanal" "Wuhle" "Hellersdorfer Graben" "Panke" ...
#>   .. ..$ Betreiber        : chr [1:16] "Land Berlin" "Land Berlin" "Land Berlin" "Land Berlin" ...
#>   .. ..$ Datum            : chr [1:16] "" "07.08.2022 23:30" "08.08.2022 06:00" "08.08.2022 06:00" ...
#>   .. ..$ Durchfluss       : num [1:16] NA 0.056 0.001 0.381 0.58 0.197 0.447 2.1 -0.248 3.4 ...
#>   .. ..$ Einheit          : chr [1:16] "m³/s" "m³/s" "m³/s" "m³/s" ...
#>   .. ..$ Ganglinie        : logi [1:16] NA NA NA NA NA NA ...
#>   .. ..$ Klassifikation   : chr [1:16] "nicht aktuell" "sehr niedrig" "keine" "niedrig" ...
#>   ..$ surface_water.temperature         : tibble [64 × 9] (S3: tbl_df/tbl/data.frame)
#>   .. ..$ Messstellennummer: chr [1:64] "601" "151" "153" "509" ...
#>   .. ..$ Messstellenname  : chr [1:64] "MPS Berlin-Spandauer-Schifffahrtskanal" "MPS Caprivibrücke" "MPS Charlottenburg" "MPS Landwehrkanal" ...
#>   .. ..$ Gewaesser        : chr [1:64] "Berlin-Spandauer-Schifffahrtskanal" "Spree" "Spree" "Landwehrkanal" ...
#>   .. ..$ Betreiber        : chr [1:64] "Land Berlin" "Land Berlin" "Land Berlin" "Land Berlin" ...
#>   .. ..$ Datum            : chr [1:64] "08.08.2022 06:00" "08.08.2022 06:00" "08.08.2022 06:00" "08.08.2022 06:00" ...
#>   .. ..$ Wassertemperatur : chr [1:64] "23.60" "22.61" "22.63" "22.67" ...
#>   .. ..$ Einheit          : chr [1:64] "°C" "°C" "°C" "°C" ...
#>   .. ..$ Ganglinie        : logi [1:64] NA NA NA NA NA NA ...
#>   .. ..$ Klassifikation   : chr [1:64] ">20 - 25°C" ">20 - 25°C" ">20 - 25°C" ">20 - 25°C" ...
#>   ..$ surface_water.conductivity        : tibble [16 × 9] (S3: tbl_df/tbl/data.frame)
#>   .. ..$ Messstellennummer: chr [1:16] "601" "151" "153" "509" ...
#>   .. ..$ Messstellenname  : chr [1:16] "MPS Berlin-Spandauer-Schifffahrtskanal" "MPS Caprivibrücke" "MPS Charlottenburg" "MPS Landwehrkanal" ...
#>   .. ..$ Gewaesser        : chr [1:16] "Berlin-Spandauer-Schifffahrtskanal" "Spree" "Spree" "Landwehrkanal" ...
#>   .. ..$ Betreiber        : chr [1:16] "Land Berlin" "Land Berlin" "Land Berlin" "Land Berlin" ...
#>   .. ..$ Datum            : chr [1:16] "08.08.2022 06:00" "08.08.2022 06:00" "08.08.2022 06:00" "08.08.2022 06:00" ...
#>   .. ..$ Leitfaehigkeit   : chr [1:16] "1038" "1043" "1009" "1043" ...
#>   .. ..$ Einheit          : chr [1:16] "µS/cm" "µS/cm" "µS/cm" "µS/cm" ...
#>   .. ..$ Ganglinie        : logi [1:16] NA NA NA NA NA NA ...
#>   .. ..$ Klassifikation   : chr [1:16] ">1000 - 1200" ">1000 - 1200" ">1000 - 1200" ">1000 - 1200" ...
#>   ..$ surface_water.ph                  : tibble [16 × 8] (S3: tbl_df/tbl/data.frame)
#>   .. ..$ Messstellennummer: chr [1:16] "601" "151" "153" "509" ...
#>   .. ..$ Messstellenname  : chr [1:16] "MPS Berlin-Spandauer-Schifffahrtskanal" "MPS Caprivibrücke" "MPS Charlottenburg" "MPS Landwehrkanal" ...
#>   .. ..$ Gewaesser        : chr [1:16] "Berlin-Spandauer-Schifffahrtskanal" "Spree" "Spree" "Landwehrkanal" ...
#>   .. ..$ Betreiber        : chr [1:16] "Land Berlin" "Land Berlin" "Land Berlin" "Land Berlin" ...
#>   .. ..$ Datum            : chr [1:16] "08.08.2022 06:00" "08.08.2022 06:00" "08.08.2022 06:00" "08.08.2022 06:00" ...
#>   .. ..$ pHWert           : chr [1:16] "8.40" "8.18" "8.27" "8.08" ...
#>   .. ..$ Ganglinie        : logi [1:16] NA NA NA NA NA NA ...
#>   .. ..$ Klassifikation   : chr [1:16] ">8.0 - 8.5" ">8.0 - 8.5" ">8.0 - 8.5" ">8.0 - 8.5" ...
#>   ..$ surface_water.oxygen_concentration: tibble [16 × 9] (S3: tbl_df/tbl/data.frame)
#>   .. ..$ Messstellennummer: chr [1:16] "601" "151" "153" "509" ...
#>   .. ..$ Messstellenname  : chr [1:16] "MPS Berlin-Spandauer-Schifffahrtskanal" "MPS Caprivibrücke" "MPS Charlottenburg" "MPS Landwehrkanal" ...
#>   .. ..$ Gewaesser        : chr [1:16] "Berlin-Spandauer-Schifffahrtskanal" "Spree" "Spree" "Landwehrkanal" ...
#>   .. ..$ Betreiber        : chr [1:16] "Land Berlin" "Land Berlin" "Land Berlin" "Land Berlin" ...
#>   .. ..$ Datum            : chr [1:16] "08.08.2022 06:00" "08.08.2022 06:00" "08.08.2022 06:00" "08.08.2022 06:00" ...
#>   .. ..$ Sauerstoffgehalt : chr [1:16] "9.18" "8.37" "7.13" "9.39" ...
#>   .. ..$ Einheit          : chr [1:16] "mg/l" "mg/l" "mg/l" "mg/l" ...
#>   .. ..$ Ganglinie        : logi [1:16] NA NA NA NA NA NA ...
#>   .. ..$ Klassifikation   : chr [1:16] ">5 - 10" ">5 - 10" ">5 - 10" ">5 - 10" ...
#>   ..$ surface_water.oxygen_saturation   : tibble [16 × 9] (S3: tbl_df/tbl/data.frame)
#>   .. ..$ Messstellennummer: chr [1:16] "601" "151" "153" "509" ...
#>   .. ..$ Messstellenname  : chr [1:16] "MPS Berlin-Spandauer-Schifffahrtskanal" "MPS Caprivibrücke" "MPS Charlottenburg" "MPS Landwehrkanal" ...
#>   .. ..$ Gewaesser        : chr [1:16] "Berlin-Spandauer-Schifffahrtskanal" "Spree" "Spree" "Landwehrkanal" ...
#>   .. ..$ Betreiber        : chr [1:16] "Land Berlin" "Land Berlin" "Land Berlin" "Land Berlin" ...
#>   .. ..$ Datum            : chr [1:16] "06.08.2022 23:00" "06.08.2022 23:00" "06.08.2022 23:00" "06.08.2022 23:00" ...
#>   .. ..$ Parameterwert    : chr [1:16] "121.23" "109.69" "118.73" "114.43" ...
#>   .. ..$ Einheit          : chr [1:16] "%" "%" "%" "%" ...
#>   .. ..$ Ganglinie        : logi [1:16] NA NA NA NA NA NA ...
#>   .. ..$ Klassifikation   : chr [1:16] ">100" ">100" ">100" ">100" ...
#>   ..$ groundwater.level                 : tibble [878 × 10] (S3: tbl_df/tbl/data.frame)
#>   .. ..$ Messstellennummer        : int [1:878] 1 2 3 4 9 24 25 26 30 31 ...
#>   .. ..$ Bezirk                   : chr [1:878] "Reinickendorf" "Reinickendorf" "Reinickendorf" "Reinickendorf" ...
#>   .. ..$ Auspraegung              : chr [1:878] "GW-Stand" "GW-Stand" "GW-Stand + GW-Güte" "GW-Stand" ...
#>   .. ..$ Grundwasserleiter        : chr [1:878] "Hauptgrundwasserleiter (GWL 1.3 + 2)" "Hauptgrundwasserleiter (GWL 1.3 + 2)" "Hauptgrundwasserleiter (GWL 1.3 + 2)" "Hauptgrundwasserleiter (GWL 1.3 + 2)" ...
#>   .. ..$ Grundwasserspannung      : chr [1:878] "gespannt" "ungespannt" "gespannt" "ungespannt" ...
#>   .. ..$ Datum                    : chr [1:878] "06.07.2022" "06.07.2022" "06.07.2022" "06.07.2022" ...
#>   .. ..$ Grundwasserstand_m_ue_NHN: num [1:878] 33.7 35 33.6 32.4 36.2 ...
#>   .. ..$ Flur_abstand_m_u_GOK     : chr [1:878] "keine Angabe" "2.67" "keine Angabe" "7.51" ...
#>   .. ..$ Ganglinie                : logi [1:878] NA NA NA NA NA NA ...
#>   .. ..$ Klassifikation           : chr [1:878] "extrem niedrig" "extrem niedrig" "sehr niedrig" "extrem niedrig" ...
#>   ..$ groundwater.quality               : tibble [209 × 9] (S3: tbl_df/tbl/data.frame)
#>   .. ..$ Messstellennummer: int [1:209] 3 145 149 282 344 358 499 580 604 645 ...
#>   .. ..$ Bezirk           : chr [1:209] "Reinickendorf" "Reinickendorf" "Mitte" "Mitte" ...
#>   .. ..$ Auspraegung      : chr [1:209] "GW-Stand + GW-Güte 5" "GW-Stand + GW-Güte 5" "GW-Stand + GW-Güte 5" "GW-Stand + GW-Güte 5" ...
#>   .. ..$ Grundwasserleiter: chr [1:209] "Hauptgrundwasserleiter (GWL 1.3 + 2)" "Hauptgrundwasserleiter (GWL 1.3 + 2)" "Hauptgrundwasserleiter (GWL 1.3 + 2)" "Hauptgrundwasserleiter (GWL 1.3 + 2)" ...
#>   .. ..$ Datum            : chr [1:209] "17.11.2021" "18.10.2021" "19.10.2021" "15.11.2021" ...
#>   .. ..$ Parameterwert    : num [1:209] 12.3 11.8 11.8 12.2 13 12.5 12.7 13 15.9 12 ...
#>   .. ..$ Einheit          : chr [1:209] "grd C" "grd C" "grd C" "grd C" ...
#>   .. ..$ Ganglinie        : logi [1:209] NA NA NA NA NA NA ...
#>   .. ..$ Klassifikation   : chr [1:209] "keine" "keine" "keine" "keine" ...
#>  $ overview_df  :Classes 'data.table' and 'data.frame':  1304 obs. of  26 variables:
#>   ..$ key                      : chr [1:1304] "surface_water.water_level" "surface_water.water_level" "surface_water.water_level" "surface_water.water_level" ...
#>   ..$ Messstellennummer        : chr [1:1304] "5865900" "5870400" "5865300" "5819900" ...
#>   ..$ Messstellenname          : chr [1:1304] "Allee der Kosmonauten" "Alsenbrücke" "Am Bahndamm" "Am Freibad" ...
#>   ..$ Gewaesser                : chr [1:1304] "M.-H.-Grenzgr." "Griebnitzkanal" "Wuhle" "Tegeler Fließ" ...
#>   ..$ Betreiber                : chr [1:1304] "Land Berlin" "Land Berlin" "Land Berlin" "Land Berlin" ...
#>   ..$ Datum                    : chr [1:1304] "08.08.2022 06:00" "08.08.2022 06:00" "08.08.2022 06:00" "08.08.2022 06:00" ...
#>   ..$ Wasserstand              : int [1:1304] 0 48 90 50 3 24 67 73 90 37 ...
#>   ..$ Einheit                  : chr [1:1304] "cm" "cm" "cm" "cm" ...
#>   ..$ Ganglinien               : logi [1:1304] NA NA NA NA NA NA ...
#>   ..$ Klassifikation           : chr [1:1304] "niedrig" "niedrig" "niedrig" "niedrig" ...
#>   ..$ Durchfluss               : num [1:1304] NA NA NA NA NA NA NA NA NA NA ...
#>   ..$ Ganglinie                : logi [1:1304] NA NA NA NA NA NA ...
#>   ..$ Wassertemperatur         : chr [1:1304] NA NA NA NA ...
#>   ..$ Leitfaehigkeit           : chr [1:1304] NA NA NA NA ...
#>   ..$ pHWert                   : chr [1:1304] NA NA NA NA ...
#>   ..$ Sauerstoffgehalt         : chr [1:1304] NA NA NA NA ...
#>   ..$ Parameterwert            : chr [1:1304] NA NA NA NA ...
#>   ..$ Bezirk                   : chr [1:1304] NA NA NA NA ...
#>   ..$ Auspraegung              : chr [1:1304] NA NA NA NA ...
#>   ..$ Grundwasserleiter        : chr [1:1304] NA NA NA NA ...
#>   ..$ Grundwasserspannung      : chr [1:1304] NA NA NA NA ...
#>   ..$ Grundwasserstand_m_ue_NHN: num [1:1304] NA NA NA NA NA NA NA NA NA NA ...
#>   ..$ Flur_abstand_m_u_GOK     : chr [1:1304] NA NA NA NA ...
#>   ..$ water_body               : chr [1:1304] "surface_water" "surface_water" "surface_water" "surface_water" ...
#>   ..$ variable                 : chr [1:1304] "water_level" "water_level" "water_level" "water_level" ...
#>   ..$ station_type             : chr [1:1304] "ws" "ws" "ws" "ws" ...
#>   ..- attr(*, ".internal.selfref")=<externalptr> 
#>  $ crosstable   : tibble [1,007 × 11] (S3: tbl_df/tbl/data.frame)
#>   ..$ Messstellennummer: chr [1:1007] "5865900" "5870400" "5865300" "5819900" ...
#>   ..$ Messstellenname  : chr [1:1007] "Allee der Kosmonauten" "Alsenbrücke" "Am Bahndamm" "Am Freibad" ...
#>   ..$ ws               : chr [1:1007] "x" "x" "x" "x" ...
#>   ..$ df               : chr [1:1007] NA "x" "x" NA ...
#>   ..$ wt               : chr [1:1007] NA NA "x" NA ...
#>   ..$ lf               : chr [1:1007] NA NA NA NA ...
#>   ..$ ph               : chr [1:1007] NA NA NA NA ...
#>   ..$ og               : chr [1:1007] NA NA NA NA ...
#>   ..$ os               : chr [1:1007] NA NA NA NA ...
#>   ..$ gws              : chr [1:1007] NA NA NA NA ...
#>   ..$ gwq              : chr [1:1007] NA NA NA NA ...

jsonlite::write_json(stations$crosstable, 
                     path = "stations_crosstable.json",
                     pretty = TRUE)
DT::datatable(stations$crosstable, filter = "top", caption = "Data availabilty 
              per monitoring station")

The crosstable data for checking data availabilty of the monitoring stations is also available in JSON format here: https://kwb-r.github.io/wasserportal/stations_crosstable.json

GW level

Master data

Overview data of GW level stations can be requested as shown below:


DT::datatable(stations$overview_list$groundwater.level, filter = "top")

Master data of GW level stations can be requested as shown below:

stations_gwl_master <- wasserportal::get_wasserportal_masters_data(
  station_ids = stations$overview_list$groundwater.level$Messstellennummer
)
#> Importing 878 station metadata from Wasserportal Berlin ... ok. (6.28s)

jsonlite::write_json(stations_gwl_master, 
                     path = "stations_gwl_master.json",
                     pretty = TRUE)

DT::datatable(stations_gwl_master, filter = "top")

The master data of GW level stations is also available in JSON format here: https://kwb-r.github.io/wasserportal/stations_gwl_master.json

Trend Classification

GW level trend classification (provided by SenWeb) is visualized below.

Trend Classification Histogramm

gwl <- stations$overview_list$groundwater.level %>% 
  dplyr::mutate(Datum = as.Date(Datum, format = "%d.%m.%Y"))

text_low_levels <- c("extrem niedrig", "sehr niedrig", "niedrig")
text_high_levels <- c("hoch", "sehr hoch", "extrem hoch")
levels_ordered <- c(text_low_levels, "normal", text_high_levels, "keine")

gwl$Klassifikation <- forcats::fct_relevel(gwl$Klassifikation, levels_ordered)

gwl_classified_only <- gwl %>% dplyr::filter(Klassifikation != "keine")

percental_share_low_levels <- 100*sum(gwl_classified_only$Klassifikation %in% text_low_levels)/nrow(gwl_classified_only) 

percental_share_high_levels <- 100*sum(gwl_classified_only$Klassifikation %in% text_high_levels)/nrow(gwl_classified_only) 

title_text <- sprintf("GW level classification (n = %d out of %d have 'classification' data)", nrow(gwl_classified_only), nrow(gwl))

g1 <- gwl_classified_only %>% 
  dplyr::count(Klassifikation, Grundwasserspannung) %>% 
  dplyr::mutate(percental_share = 100 * n / nrow(gwl)) %>% 
  ggplot2::ggplot(ggplot2::aes_string(x = "Klassifikation",
                                      y = "percental_share",
                                      fill = "Grundwasserspannung")) +
  ggplot2::geom_bar(stat = "identity") + 
  ggplot2::labs(title = title_text,
                x = "Classification",
                y = "Percental share (%)") +
  ggplot2::theme_bw()

plotly::ggplotly(g1)

89.2 percent of all considered 824 GW level monitoring stations containing classification data (out of 878 provided by SenWeb) indicate below normal (extrem niedrig, sehr niedrig, niedrig) GW levels. However, only 89.2 percent are indicate above normal (hoch, sehr hoch, extrem hoch) GW levels.

Trend Classification Map
level_colors <- data.frame(Klassifikation = levels_ordered, classi_color = c(
  "darkred", "red", "orange", "green", "lightblue", "blue", "darkblue", "grey"
))

gwl_classified_only_with_coords <- gwl_classified_only %>% 
  dplyr::mutate(
    Messstellennummer = as.character(Messstellennummer),
  ) %>% 
  dplyr::left_join(
    stations_gwl_master %>%
      dplyr::select("Nummer", "Rechtswert_UTM_33_N", "Hochwert_UTM_33_N") %>% 
      dplyr::rename(Messstellennummer = "Nummer"),
    by = "Messstellennummer"
  ) %>% 
  dplyr::left_join(
    level_colors, 
    by = "Klassifikation"
  ) %>% 
  sf::st_as_sf(
    coords = c("Rechtswert_UTM_33_N", "Hochwert_UTM_33_N"),
    crs = 25833
  ) %>% 
  sf::st_transform(crs = 4326)

# Create a vector of labels for each row in gwl_classified_only_with_coords
labs <- wasserportal::columns_to_labels(
  data = gwl_classified_only_with_coords, 
  columns = c(
    "Messstellennummer", 
    "Grundwasserspannung", 
    "Klassifikation", 
    "Datum"
  ),
  fmt = "<p>%s: %s</p>",
  sep = ""
)

# Print Map
gwlmap <- gwl_classified_only_with_coords %>% 
  leaflet::leaflet() %>%
  leaflet::addTiles() %>% 
  leaflet::addProviderTiles(leaflet::providers$CartoDB.Positron) %>%
  leaflet::addCircles(
    color = ~classi_color,
    label = lapply(labs, htmltools::HTML)
  ) %>% 
  leaflet::addLegend(
    position = "topright",
    colors = level_colors$classi_color,
    labels = level_colors$Klassifikation,
    title = sprintf(
      "Classification (latest data: %s)",
      max(gwl_classified_only_with_coords$Datum)
    )
  )

htmlwidgets::saveWidget(
  gwlmap, 
  "./map_gwl-trend.html", 
  title = "GW level trend"
)

gwlmap

GW level trend plot is also available on a full html page here: https://kwb-r.github.io/wasserportal/map_gwl-trend.html

Download and Plotting One Station

for total period available.

station_gwl <- stations$overview_list$groundwater.level[1,]
ncols <- 2:ncol(station_gwl)

gw_level <- wasserportal::read_wasserportal_raw_gw(
  station = station_gwl$Messstellennummer, 
  stype = "gwl") %>% 
dplyr::mutate(Label = sprintf("%s (%s)", Parameter, Einheit))
head(gw_level)
#> # A tibble: 6 × 6
#>   Messstellennummer Datum      Parameter Einheit  Messwert Label              
#>               <int> <date>     <chr>     <chr>       <dbl> <chr>              
#> 1                 1 1970-01-02 GW-Stand  m ü. NHN     35.2 GW-Stand (m ü. NHN)
#> 2                 1 1970-01-16 GW-Stand  m ü. NHN     35.2 GW-Stand (m ü. NHN)
#> 3                 1 1970-02-02 GW-Stand  m ü. NHN     35.2 GW-Stand (m ü. NHN)
#> 4                 1 1970-02-16 GW-Stand  m ü. NHN     35.2 GW-Stand (m ü. NHN)
#> 5                 1 1970-03-02 GW-Stand  m ü. NHN     35.2 GW-Stand (m ü. NHN)
#> 6                 1 1970-03-16 GW-Stand  m ü. NHN     35.2 GW-Stand (m ü. NHN)

g <- gw_level %>% 
ggplot2::ggplot(ggplot2::aes_string(x = "Datum", y = "Messwert", col = "Label")) +
ggplot2::geom_line() +
ggplot2::geom_point() +
ggplot2::theme_bw()


title_subtitle <- paste0(paste0(names(station_gwl)[1], ": ", 
                             station_gwl[1], 
                             collapse =", "),
       "<br>",
       "<sup>",
       paste0(names(station_gwl)[ncols], ": ",
              station_gwl[ncols], 
              collapse =", "),
       "</sup>")


plotly::ggplotly(g) %>%
  plotly::layout(title = list(text = title_subtitle))