Rohingya Camp Fecal Sludge Treatment Plant (FSTP) Evaluation

Author

Qazi Aniqua Zahra

Published

January 30, 2026

1. Introduction

Project Description

The data shows FSTP locations in the Rohingya Refugee camps at Cox’s Bazaar. It has general information on FSTP operator, contact info, FSTP location and type. Furthermore it has the info on samples collected from the FSTPs and their characterization results. There are 2454 observations and 48 variables in the raw data.

My goal is to first find some basic information about the data. Then in the next step I will analyze, for each camp, calculate the mean of effluent quality for each camp with multiple FSTPs, review what the effluent quality change was over the years and map the FSTP locations based on the effluent quality to get a geographic visualization of areas are doing better or worse.

2. Methods

Raw effluent data was imported to R and cleaned by removing samples with missing data (NA) for Nitrate, Phosphate, BOD, COD and E.coli. The data variables to inlclude in the analysis were also selected and the columns renamed. This resulted in a processed database of 1412 observations with 13 variables.

Within the processed data, first the data was summarized by camp to get some basic information about the camps - number of camps, number of FSTPs total and by camp, years of sample collection and types of FSTP.

2.1 Importing Data

Code
library(tidyverse)
library(readxl)
library(dplyr)
library(here)
library(lubridate)
library(ggplot2)
library(ggthemes)
library(gt)
library(viridis)
library(dplyr)
library(gt)
library(purrr)
library(tidyr)
library(leaflet)
library(readr)
library(RColorBrewer)


read_excel(here::here("data/raw/Waste-Water-Quality-Monitoring-Data-1-anonymised.xlsx"))
# A tibble: 2,454 × 48
   Organization `Sample ID`     `Sample Collection` `Camp ID` `WASH AFA`
   <chr>        <chr>           <dttm>              <chr>     <chr>     
 1 BRAC         DPHE-FSL-S-775  2023-04-06 00:00:00 Camp 01E  UNHCR     
 2 BRAC         DPHE-FSL-S-940  2023-10-18 00:00:00 Camp 01E  UNHCR     
 3 BRAC         DPHE-FSL-S-1108 2024-05-02 00:00:00 Camp 01E  UNHCR     
 4 BRAC         DPHE/FSL/S/004  2021-12-30 00:00:00 Camp 01E  UNHCR     
 5 BRAC         DPHE/FSL/S/0165 2022-05-29 00:00:00 Camp 01E  UNHCR     
 6 BRAC         DPHE/FSL/S/0370 2022-09-27 00:00:00 Camp 01E  UNHCR     
 7 BRAC         DPHE/FSL/S/596  2023-01-09 00:00:00 Camp 01E  UNHCR     
 8 BRAC         DPHE/FSL/S/024  2022-01-24 00:00:00 Camp 01E  UNHCR     
 9 BRAC         DPHE/FSL/S/0164 2022-05-29 00:00:00 Camp 01E  UNHCR     
10 BRAC         DPHE/FSL/S/0369 2022-09-27 00:00:00 Camp 01E  UNHCR     
# ℹ 2,444 more rows
# ℹ 43 more variables: `FSTP ID (By DPHE)` <chr>,
#   `FSTP ID (Organization)` <chr>, Block <chr>, `Sub Block` <chr>,
#   `FSTP Type` <chr>, `Capacity (m3/week)` <dbl>, Latitude <dbl>,
#   Longitude <dbl>, `Sample Type` <chr>, pH <dbl>,
#   `Temperature (Degree C)` <dbl>, `TN (mg/l)` <dbl>, `Nitrate (mg/l)` <dbl>,
#   `Phosphate (mg/l)` <dbl>, `BOD (mg/l)` <dbl>, `COD (mg/l)` <dbl>, …
Code
raw_data <- read_excel(here::here("data/raw/Waste-Water-Quality-Monitoring-Data-1-anonymised.xlsx"))

[Wickham, Vaughan, and Girlich (2024)](Wickham et al. 2019)(Arnold 2024)

2.2 Removing NAs

Code
processed_data <- raw_data |>
  select(`Camp ID`, `Sample ID`, `Sample Collection`, `FSTP ID (By DPHE)`, `FSTP Type`, Latitude, Longitude, pH, `Nitrate (mg/l)`, `Phosphate (mg/l)`, `BOD (mg/l)`, `COD (mg/l)`, `E.Coli (cfu/100 ml)`) |>
   rename(CampID = 'Camp ID', 
         SampleID = 'Sample ID', 
         Date_collect = 'Sample Collection', 
         FSTPID = 'FSTP ID (By DPHE)',
         FSTP_type = 'FSTP Type',
         Lat = Latitude, 
         Long = Longitude, 
         Nitrate = `Nitrate (mg/l)`, 
         Phosphate = `Phosphate (mg/l)`, 
         BOD = `BOD (mg/l)`, 
         COD = `COD (mg/l)`, 
         Ecoli = `E.Coli (cfu/100 ml)`) |>
   filter(!is.na(Nitrate), !is.na(Phosphate), !is.na(BOD), !is.na(COD), !is.na(Ecoli)) 

write_csv(processed_data,
          here::here("data/processed/CampWasteWater_processed.csv"))

3. Results

3.1 Finding Basic Profile Information

a. Total counts of FSTPs and unique technologies used

Number of unique FSTPs in this processed database is 269. There are 33 camps in the area utilizing 14 varieties of FSTP technology.

Code
# Total number of unique FSTPs
processed_data |>
  summarise(total_unique_FSTP_count = n_distinct(FSTPID)) |>
  print()
# A tibble: 1 × 1
  total_unique_FSTP_count
                    <int>
1                     269
Code
# Total number of unique FSTP types
processed_data |>
  summarise(total_unique_FSTP_type_count = n_distinct(FSTP_type)) |>
  print()
# A tibble: 1 × 1
  total_unique_FSTP_type_count
                         <int>
1                           14
b. Summarizing the data by Year

Summarizing the processed data year and collected samples it is found that the collection years were 2021 through 2025.

NOTE: In 2021 only 5 samples were collected. So 2021 will be omitted from further analysis. Furthermore, upon trying to plot the sample count it was found that some FSTP technology have only a few FSTPs active (less than 10) so dropping them from the plot.

Code
processed_data <- processed_data |>
  mutate(Date_collect = as.Date(Date_collect),
         Year = year(Date_collect)) |>
  filter(Year != 2021)  # Exclude the year 2021

# Count samples collected by year
samples_per_year <- processed_data |>
  group_by(Year, FSTP_type) |>
  summarise(Sample_Count = n(), .groups = 'drop')|>
  filter(Sample_Count >= 10)

print(samples_per_year)
# A tibble: 23 × 3
    Year FSTP_type                       Sample_Count
   <dbl> <chr>                                  <int>
 1  2022 Anaerobic Baffled Reactor - ABR          121
 2  2022 DEWATS                                    47
 3  2022 Lime Stabilization Pond - LSP             85
 4  2022 Open Defication Pond - ODP                20
 5  2022 Solid Seperation Unit - SSU              104
 6  2022 Uplfow Filtration - UFF                  122
 7  2022 Waste Stablization Pond - WSP             39
 8  2023 Anaerobic Baffled Reactor - ABR          137
 9  2023 DEWATS                                    86
10  2023 Lime Stabilization Pond - LSP             42
# ℹ 13 more rows
Code
ggplot(data = samples_per_year,
       mapping = aes(x = Year, 
                     y = Sample_Count,
                     fill = FSTP_type)) + 
  geom_bar(stat = "identity", position = "dodge") +              
  labs(x = "Year", 
       y = "Number of Samples", 
       title = "Number of Samples Collected by Year and FSTP Type") +
  scale_fill_colorblind() +
  theme_minimal()
Figure 1: Number of Samples Collected by Year and FSTP Type

Figure 1 shows the distribution of samples collected over the years by type of FSTP technology utilized. ABR and UFF have the highest samples collected closely followed by DEWATS and SSU. It is evident that sample collection dropped significantly in 2024, from 2023.

c. Summarizing the data by Camp and FSTP technology
Code
# Summarize the data by CampID and FSTP Type
summary_by_camp_and_type <- processed_data |>
  group_by(CampID, FSTP_type) |>
  summarise(
    unique_FSTP_count = n_distinct(FSTPID),  # Count unique FSTP 
    total_FSTP_count = n(),                   # Total number FTSP
    .groups = 'drop'                          
  )

glimpse(summary_by_camp_and_type)
Rows: 81
Columns: 4
$ CampID            <chr> "Camp 01E", "Camp 01E", "Camp 01W", "Camp 01W", "Cam…
$ FSTP_type         <chr> "Anaerobic Baffled Reactor - ABR", "Lime Stabilizati…
$ unique_FSTP_count <int> 3, 1, 2, 1, 3, 7, 5, 1, 7, 8, 5, 2, 2, 2, 2, 2, 4, 6…
$ total_FSTP_count  <int> 7, 4, 7, 1, 9, 7, 15, 1, 24, 18, 19, 6, 7, 3, 15, 8,…
Code
# Summarize the data by FSTP Type
summary_by_FSTPtype <- processed_data |>
  group_by(FSTP_type) |>
  summarise(
    unique_FSTP_count = n_distinct(FSTPID), 
    .groups = 'drop'                          
  )
glimpse(summary_by_FSTPtype)
Rows: 14
Columns: 2
$ FSTP_type         <chr> "Anaerobic Baffled Reactor - ABR", "Anaerobic Lagoon…
$ unique_FSTP_count <int> 74, 4, 1, 2, 7, 1, 60, 4, 39, 2, 15, 53, 65, 28
Code
# Calculate total counts for each CampID for labels
totals <- summary_by_camp_and_type |>
  group_by(CampID) |>
  summarise(total_count = sum(unique_FSTP_count), .groups = 'drop')


# Create a bar plot of FSTP Type counts by Camp
ggplot(summary_by_camp_and_type, 
       aes(x = CampID, y = unique_FSTP_count, fill = FSTP_type)) +
  geom_bar(stat = "identity") +  # Stacked bars by default
  geom_text(data = totals, 
            aes(x = CampID, y = total_count, label = total_count), 
            vjust = -0.5, size = 3, inherit.aes = FALSE) +  # Position the total label above the bar
  labs(title = "Diversity of FSTP Technology by Camp", 
       x = "Camp ID", 
       y = "Number of FSTP",
       fill = "FSTP Type") + 
  theme_minimal() +  
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +  # Rotate x labels to vertical
  scale_fill_viridis(discrete = TRUE) 
Figure 2: Diversity of FSTP Technology by Camp

The various FSTP technologies were summarized by camp. Figure 2 shows Diversity of FSTP technology by camp in Cox’s Bazar where the number of FSTP installations per camp represents different FSTP types with colors. The Viridis color palette was used to ensure all categories are displayed, are visually distinct, colorblind-accessible, and perceptually uniform . Total counts per camp are displayed above each bar.

The bars show that 4 camps - 02W, 13, 15 and 25 are utilizing the highest 4 types each. This made sense for Camp 15 with highest 37 FSTPs, but in Camp 25 there are only 6 in. total!

Seeing the diversity in some of the camps, the co-ordinates of FSTPs were plotted in a map to geographically see the spatial distribution. Here, an interactive map of FSTP types in Cox’s Bazar was created using the Leaflet R package (Cheng et al. 2025) for mapping and RColorBrewer (Neuwirth 2022) for color palettes, with rare FSTP types grouped into ‘Other’ for clarity.

Code
processed_data <- read_csv(here::here("data/processed/CampWasteWater_processed.csv"))

# Clean FSTP_type and group rare types
processed_data <- processed_data %>%
  mutate(FSTP_type = trimws(as.character(FSTP_type)))

# Count occurrences
type_counts <- processed_data %>%
  count(FSTP_type, name = "n")

# Group rare types into "Other"
threshold <- 20
processed_data <- processed_data %>%
  left_join(type_counts, by = "FSTP_type") %>%
  mutate(FSTP_type = ifelse(n < threshold, "Other", FSTP_type)) %>%
  select(-n)

# Recount frequencies after grouping
freq_counts <- processed_data %>%
  count(FSTP_type, name = "freq") %>%
  arrange(desc(freq))  # sort descending

# Define legend order: top types first, "Other" last
legend_order <- freq_counts$FSTP_type[freq_counts$FSTP_type != "Other"]
if ("Other" %in% freq_counts$FSTP_type) legend_order <- c(legend_order, "Other")

# Convert FSTP_type to factor with levels = legend_order
processed_data <- processed_data %>%
  mutate(FSTP_type = factor(FSTP_type, levels = legend_order))

# Create palette
palette_colors <- brewer.pal(n = max(length(legend_order), 3), name = "Set2")[1:length(legend_order)]
names(palette_colors) <- legend_order

pal <- colorFactor(
  palette = palette_colors,
  domain = processed_data$FSTP_type,
  na.color = "#B0B0B0"
)

# --- Leaflet map ---
leaflet(processed_data) %>%
  addTiles() %>%
  setView(
    lng = mean(processed_data$Long, na.rm = TRUE),
    lat = mean(processed_data$Lat, na.rm = TRUE),
    zoom = 12
  ) %>%
  addCircleMarkers(
    lng = ~Long,
    lat = ~Lat,
    radius = 6,
    fillColor = ~pal(FSTP_type),
    fillOpacity = 0.8,
    stroke = FALSE,
    popup = ~paste("<b>Camp:</b>", CampID, "<br>",
                   "<b>FSTP Type:</b>", FSTP_type)
  ) %>%
  addLegend(
    position = "bottomright",
    pal = pal,
    values = processed_data$FSTP_type,  # now a factor with levels in order
    title = "FSTP Types",
    opacity = 0.8
  )
Figure 3: Map of FSTP Locations by Technology Type in Cox’s Bazar, Bangladesh

Figure 3 shows the location distribution of FSTP. The color is by type of FSTP technology used. This helps to visualize where the various types of FSTPs are concentrated. Visually it seems like, certain areas like the north-west of the study area has more SSU, while north and south have UFF concentration, LSP more in the north and east, and ABR existing throughout the entire study area. There are a few FSTP locations showing in the sea or in Myanmar - which are due to incorrect coordinate collection.

3.2 Analysis of Effluent Quality

Table 1 shows the summary statistics of various effluent contents by the FSTP technology.

Code
variables <- c("Nitrate", "Phosphate", "BOD", "COD", "Ecoli")

# summary statistics
summary_stats <- processed_data |>
  group_by(FSTP_type) |>
  summarise(across(all_of(variables), 
                   list(
                     count = ~ sum(!is.na(.)),
                     mean = ~ mean(.),
                     median = ~ median(.),
                     sd = ~ sd(.)),
                   .names = "{col}_{fn}")) |> 
  pivot_longer(cols = -FSTP_type,
               names_to = c("Variable", ".value"),
               names_sep = "_")

# Create a table
summary_table <- summary_stats |>
  gt() |>
  tab_header(
    title = "Summary Statistics of Effluent Quality Parameters by FSTP Type",
    subtitle = "Data from 33 Refugee Camps (269 FSTPs) "
  ) |>
  fmt_number(
    columns = everything(), 
    decimals = 0
  ) |>
  cols_label(
    count = "Count",
    mean = "Mean",
    median = "Median",
    sd = "Standard Deviation"
  ) |>
  cols_label(FSTP_type = "FSTP Type")

# Print the summary table
summary_table
Table 1: Summary Statistics of Effluent Quality Parameters. Data from 33 Camps (269 FSTPs).
Summary Statistics of Effluent Quality Parameters by FSTP Type
Data from 33 Refugee Camps (269 FSTPs)
FSTP Type Variable Count Mean Median Standard Deviation
Anaerobic Baffled Reactor - ABR Nitrate 345 37 20 75
Anaerobic Baffled Reactor - ABR Phosphate 345 39 29 30
Anaerobic Baffled Reactor - ABR BOD 345 218 179 162
Anaerobic Baffled Reactor - ABR COD 345 600 486 416
Anaerobic Baffled Reactor - ABR Ecoli 345 252,405 40,000 689,250
Uplfow Filtration - UFF Nitrate 307 32 18 63
Uplfow Filtration - UFF Phosphate 307 42 29 35
Uplfow Filtration - UFF BOD 307 254 193 300
Uplfow Filtration - UFF COD 307 722 520 1,068
Uplfow Filtration - UFF Ecoli 307 730,777 110,000 3,938,494
DEWATS Nitrate 217 37 21 54
DEWATS Phosphate 217 38 29 32
DEWATS BOD 217 230 204 137
DEWATS COD 217 630 583 380
DEWATS Ecoli 217 151,288 1,000 1,040,817
Solid Seperation Unit - SSU Nitrate 215 20 16 17
Solid Seperation Unit - SSU Phosphate 215 33 27 26
Solid Seperation Unit - SSU BOD 215 247 205 160
Solid Seperation Unit - SSU COD 215 708 531 503
Solid Seperation Unit - SSU Ecoli 215 570,387 80,000 1,449,752
Lime Stabilization Pond - LSP Nitrate 140 23 18 32
Lime Stabilization Pond - LSP Phosphate 140 47 33 58
Lime Stabilization Pond - LSP BOD 140 316 280 222
Lime Stabilization Pond - LSP COD 140 786 711 547
Lime Stabilization Pond - LSP Ecoli 140 319,232 100,000 658,683
Waste Stablization Pond - WSP Nitrate 104 25 19 31
Waste Stablization Pond - WSP Phosphate 104 26 18 24
Waste Stablization Pond - WSP BOD 104 167 119 175
Waste Stablization Pond - WSP COD 104 446 308 379
Waste Stablization Pond - WSP Ecoli 104 4,514,348 60,000 38,900,093
Open Defication Pond - ODP Nitrate 25 14 13 8
Open Defication Pond - ODP Phosphate 25 64 58 42
Open Defication Pond - ODP BOD 25 252 206 165
Open Defication Pond - ODP COD 25 644 616 464
Open Defication Pond - ODP Ecoli 25 393,200 200,000 469,195
Biological Process Nitrate 21 93 37 124
Biological Process Phosphate 21 30 28 17
Biological Process BOD 21 196 190 141
Biological Process COD 21 580 495 420
Biological Process Ecoli 21 159,905 2,000 337,455
Other Nitrate 38 66 23 94
Other Phosphate 38 25 18 20
Other BOD 38 156 92 142
Other COD 38 424 292 333
Other Ecoli 38 258,132 17,200 722,597
Code
processed_data <- processed_data |>
  mutate(Date_collect = as.Date(Date_collect),
         Year = as.integer(year(Date_collect))) |>
  filter(Year != 2021)

median_values <- processed_data |>
  group_by(Year, FSTP_type) |>
  summarise(across(all_of(variables), median, na.rm = TRUE),
            .groups = "drop")
Code
ggplot(
  median_values,
  aes(x = Year, y = Nitrate, color = FSTP_type)
) +
  geom_line(linewidth = 1.2) +
  geom_point(size = 3) +
  labs(
    title = "Nitrate Concentration in Effluent by Year and FSTP Type",
    x = "Year",
    y = "Median Nitrate (mg/L)",
    color = "FSTP Type"
  ) +
  scale_color_viridis_d() +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5)
  )
Figure 4: Nitrate in Effluent by Year and FSTP Type

Figure 4 shows that nitrate levels from various FSTP technologies each year, and they seem to follow a similar trend for all technologies except Biological process and other (omni processor, anaerobic lagoon, geotube etc.). Though always higher than the other technologies, Biological process shows a jump in nitrate levels in 2024 and 2025.

Code
ggplot(
  median_values,
  aes(x = Year, y = Phosphate, color = FSTP_type)
) +
  geom_line(linewidth = 1.2) +
  geom_point(size = 3) +
  labs(
    title = "Phosphate Concentration in Effluent by Year and FSTP Type",
    x = "Year",
    y = "Median Phosphate (mg/L)",
    color = "FSTP Type"
  ) +
  scale_color_viridis_d() +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5)
  )
Figure 5: Phosphate in Effluent by Year and FSTP Type

Figure 5 shows that phosphate levels from various FSTP technologies each year do not seem to follow any particular trend. LSP has consistently high phosphate concentrations over the years, but there is a jump in the concentrations for SSU and UFF technologies. WSP has one of lowest phosphate levels through the years.

Code
ggplot(
  median_values,
  aes(x = Year, y = BOD, color = FSTP_type)
) +
    geom_hline(
    yintercept = 30, # BECR 2023 standards for BOD
    linetype = "dashed",
    linewidth = 1,
    color = "red"
  ) +  annotate(
    "text",
    x = min(median_values$Year),
    y = 30,
    label = "30 mg/L threshold",
    hjust = 0,
    vjust = -0.5,
    size = 3.5,
    color = "red"
  )  +
  geom_line(linewidth = 1.2) +
  geom_point(size = 3) +
  labs(
    title = "BOD Concentration in Effluent by Year and FSTP Type",
    x = "Year",
    y = "Median BOD (mg/L)",
    color = "FSTP Type"
  ) +
  scale_color_viridis_d() +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5)
  )
Figure 6: BOD in Effluent by Year and FSTP Type

Figure 6 shows that BOD levels from various FSTP technologies each year follow similar trend. LSP and SSU have consistently high BOD concentrations in effluent over the years, with WSP having one of the lowest. The dashed horizontal line indicates the reference threshold of 30 mg/L for BOD in treated effluent. None of the technologies are able to achieve that standard.

Code
ggplot(
  median_values,
  aes(x = Year, y = COD, color = FSTP_type)
) +
    geom_hline(
    yintercept = 125, # BECR 2023 standards for COD
    linetype = "dashed",
    linewidth = 1,
    color = "red"
  ) +  annotate(
    "text",
    x = min(median_values$Year),
    y = 125,
    label = "125 mg/L threshold",
    hjust = 0,
    vjust = -0.5,
    size = 3.5,
    color = "red"
  )  +
  geom_line(linewidth = 1.2) +
  geom_point(size = 3) +
  labs(
    title = "COD Concentration in Effluent by Year and FSTP Type",
    x = "Year",
    y = "Median COD (mg/L)",
    color = "FSTP Type"
  ) +
  scale_color_viridis_d() +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5)
  )
Figure 7: COD in Effluent by Year and FSTP Type

Figure 7 shows that COD levels from various FSTP technologies each year follow similar trend with 2024 and 2025 showing higher COD concentrations in all technologies. WSP has one of lowest COD levels in all years. The dashed horizontal line indicates the reference threshold of 125 mg/L for COD in treated effluent. None of the technologies are able to achieve that standard.

Code
ggplot(
  median_values,
  aes(x = Year, y = Ecoli, color = FSTP_type)
) +
    geom_hline(
    yintercept = 1000,
    linetype = "dashed",
    linewidth = 1,
    color = "red"
  ) + annotate(
    "text",
    x = min(median_values$Year),
    y = 1000,
    label = "1000 cfu/100 ml threshold",
    hjust = 0,
    vjust = -0.5,
    size = 3.5,
    color = "red"
  ) +
  geom_line(linewidth = 1.2) +
  geom_point(size = 3) +
  labs(
    title = "E. coli Concentration in Effluent by Year and FSTP Type",
    x = "Year",
    y = "Median E. coli (cfu/100 ml)",
    color = "FSTP Type"
  ) +
  scale_color_viridis_d() +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5)
  )
Figure 8: E. coli in Effluent by Year and FSTP Type

Figure 8 shows that E. coli levels from various FSTP technologies each year. All tech except UFF, BP and other follow similar trend. UFF and BP show sharp drop in E. coli in 2023 from 2022, dropping even lower in the following years to at or below recommended threshold. The dashed horizontal line indicates the reference threshold of 1000 cfu/100 ml for E. coli in treated effluent.

4. Conclusion

  • Looking at the Bangladesh Environmental Conservation Rules 2023 (BECR 2023) standards, BOD, COD and E. coli concentrations are very high than what is allowable at all technologies and all years.

  • Waste stabilization pond (WSP) seemed to be fairing better than other technologies throughout the years.

  • The location map shows the FSTP distances or use of technology did not follow any spatial pattern or depend on camp size. Further analysis, including population density might shed more light on how the technology was selected for each area.

5. References

#References

References

Arnold, Jeffrey B. 2024. “Ggthemes: Extra Themes, Scales and Geoms for ’Ggplot2’.” https://jrnold.github.io/ggthemes/.
Cheng, Joe, Barret Schloerke, Bhaskar Karambelkar, Yihui Xie, and Garrick Aden-Buie. 2025. “Leaflet: Create Interactive Web Maps with the JavaScript ’Leaflet’ Library.” https://rstudio.github.io/leaflet/.
Neuwirth, Erich. 2022. “RColorBrewer: ColorBrewer Palettes.”
Wickham, Hadley, Mara Averick, Jennifer Bryan, Winston Chang, Lucy D’Agostino McGowan, Romain François, Garrett Grolemund, et al. 2019. “Welcome to the Tidyverse 4: 1686. https://doi.org/10.21105/joss.01686.
Wickham, Hadley, Davis Vaughan, and Maximilian Girlich. 2024. “Tidyr: Tidy Messy Data.” https://tidyr.tidyverse.org.