3  Results

Code
# Importing library
library(tidyverse)  
library(readr)      
library(ggplot2)    
library(dplyr)
library(gridExtra)
library(ggalluvial)
library(scales)
library(vegan)
library(leaflet)
library(sf)
library(tigris)

tree_data <- read_csv("../2015_Street_Tree_Census_-_Tree_Data_20241120.csv", n_max = 266134)
tree_data <- na.omit(tree_data)

3.1 The Urban Canopy: NYC’s Tree Diversity

Lets first explore the overall composition of NYC’s tree population.

Code
# Count the number of trees for each species and select the top 15
top_species <- tree_data %>%
  count(spc_common, sort = TRUE) %>%
  slice_max(order_by = n, n = 15)  

# Count the number of trees for each species and select the least 15
least_species <- tree_data %>%
  count(spc_common, sort = TRUE) %>%
  slice_min(order_by = n, n = 15) 

# Create the bar plot for Top 15 Most Common Tree Species
top_species_plot <- ggplot(top_species, aes(x = reorder(spc_common, n), y = n)) +
  geom_bar(stat = "identity", fill = "#4C72B0") + 
  coord_flip() + 
  labs(
    title = "Top 15 Most Common Tree Species in NYC", 
    x = "Tree Species", 
    y = "Number of Trees"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16),  
    axis.text.y = element_text(face = "bold", size = 12),  
    axis.text.x = element_text(face = "bold", size = 12),  
    axis.title = element_text(face = "bold", size = 14))

# Create the bar plot for 15 Least Seen Tree Species
least_species_plot <- ggplot(least_species, aes(x = reorder(spc_common, n), y = n)) +
  geom_bar(stat = "identity", fill = "#D55E00") +  
  coord_flip() + 
  labs(
    title = "15 Least Common Tree Species in NYC", 
    x = "Tree Species", 
    y = "Number of Trees"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16),  
    axis.text.y = element_text(face = "bold", size = 12),  
    axis.text.x = element_text(face = "bold", size = 12),  
    axis.title = element_text(face = "bold", size = 14)  
  )

# Arrange the plots side-by-side using gridExtra
grid.arrange(
  top_species_plot, 
  least_species_plot, 
  ncol = 2  
)

The bar plot shows that the London planetree is the most common species in NYC, with over 30,000 trees, simply for its adaptability to the urban condition, such as resistance to pollution, drought, and a wide range of soil pH. While it contributes to NYC’s fall aesthetics with its dense canopies and abundant shedding, its foliage lacks the vibrant colors that species like red maple and sweetgum display, which define the iconic autumn palette. Other major contributors to NYC’s population are honeylocust, Callery pear, and pin oak. However, the high dependence on one species, the London planetree, does raise concerns of monoculture vulnerabilities as any pest or disease affecting it would result in very uneven damage. These implications indicate that further diversification could improve ecological resilience by reducing the challenges of maintenance, given the immense cleanup required for fallen debris from the London planetree.

The second bar plot shows that NYC’s most rare species, including red pine, red horse chestnut, and Douglas-fir, have fewer than 30 trees. These are indicative of the difficult conditions needed for urban adaptation, such as very specific ecological requirements and high sensitivity to pollution. Relatively rare tree species that include Osage-orange and Himalayan-cedar illustrate underutilized biodiversities that can have promise for conservation efforts. Some of these rare species could be assisted to live in an urban environment with improved soil preparation, less competition, or protection from pests. By planting a more diverse set of species, including some of these rare ones, risks from monoculture could be reduced, creating a better balance in the makeup and health of the urban forest.

3.2 Surviving the City: Daily Struggles of NYC Trees

We will see the prevalence of various tree problems in NYC, categorized into trunk, branch, and root issues using the faceted bar chart.

Code
problem_columns <- c("trunk_wire", "trnk_light", "trnk_other", 
                     "brch_light", "brch_shoe", "brch_other",
                     "root_stone", "root_grate", "root_other")

# Prepare data
problem_data <- tree_data %>%
  select(all_of(problem_columns)) %>%
  pivot_longer(cols = everything(), names_to = "problem_type", values_to = "presence") %>%
  filter(!is.na(presence)) %>%
  group_by(problem_type, presence) %>%
  summarise(count = n(), .groups = "drop")

# Create the faceted bar chart
ggplot(problem_data, aes(x = presence, y = count, fill = presence)) +
  geom_bar(stat = "identity", position = "dodge") +
  scale_fill_manual(values = c("Yes" = "#FF6347", "No" = "#4682B4")) +
  facet_wrap(~ problem_type, scales = "free_y") +
  labs(
    title = "Presence of Tree Problems by Type",
    x = "Problem Presence (Yes/No)",
    y = "Number of Trees"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16),
    axis.text.x = element_text(size = 12),
    axis.text.y = element_text(size = 12),
    axis.title = element_text(face = "bold", size = 14)
  )

Branch Problems

  • Branch problems caused by lights (brch_light) have the highest frequency of any of the branch issues but still quite rare when compared to “No”.
  • Issues that included branch problems caused by shoes (brch_shoe) and other branch problems (brch_other) are negligible.

Root Problems

  • Root problems caused by stones (root_stone) are the most significant among all categories, with a notable number of “Yes” responses. This highlights the impact of paved areas on root health.
  • Root problems caused by grates (root_grate) and other root problems (root_other) are nearly nonexistent.

Trunk Problems

  • Trunk-related issues, including problems caused by wires (trunk_wire) and lights (trnk_light), are minimal across all trees.
  • Other trunk problems (trnk_other) are extremely rare and show almost no significant impact.

The graph highlights root problems caused by stones as the primary concern, underscoring the need for improved urban planning around tree beds. Branch and trunk problems are negligible, indicating effective maintenance or fewer external stressors.

3.3 Branching Out: A Snapshot of Tree Diversity Across NYC Boroughs

The bar chart illustrates the Shannon Diversity Index for tree species across different boroughs in New York City.

Code
# Calculate Shannon Diversity Index for Each Borough

diversity_data <- tree_data %>%
  group_by(borough, spc_common) %>%
  summarize(count = n(), .groups = "drop") %>%
  group_by(borough) %>%
  summarize(diversity_index = diversity(count))

# Bar Chart
ggplot(diversity_data, aes(x = reorder(borough, -diversity_index), y = diversity_index, fill = borough)) +
  geom_col(color = "black", width = 0.7) +
  scale_fill_brewer(palette = "Set3") +
  labs(
    title = "Tree Diversity Index by Borough",
    x = "Borough",
    y = "Diversity Index",
    fill = "Borough"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", size = 16, hjust = 0.5),
    legend.position = "none"
  )

The diversity index, which quantifies the variety and distribution of species, reveals some subtle but meaningful patterns:

  1. Queens emerges with the highest diversity index, indicating that this borough has the most balanced mix of tree species. This could be due to its larger green spaces or more distributed urban forestry initiatives.

  2. Bronx and Brooklyn follow closely, showing comparable diversity indices. These boroughs likely benefit from active reforestation programs or ecological conditions that support a variety of species.

  3. Staten Island and Manhattan have slightly lower diversity indices. Staten Island’s lower population density might explain fewer diverse tree planting efforts. On the other hand, Manhattan’s highly urbanized landscape and limited green space could restrict opportunities for introducing diverse tree species.

This analysis suggests that urban planning, tree planting policies, and available green space play significant roles in influencing tree diversity across boroughs. While the differences are not drastic, the diversity index highlights the relative ecological richness of Queens, Bronx, and Brooklyn compared to the more urbanized Manhattan. These findings could guide future biodiversity-enhancing efforts in areas with lower diversity.

3.4 Rooting for Good Health: Tree Conditions in NYC Neighborhoods

The stacked diverging bar chart provides a visual summary of tree health distribution.

Code
# Prepare data
tree_data_filtered <- tree_data %>%
  filter(!is.na(health), !is.na(borough)) %>%  
  group_by(borough, health) %>%
  summarise(count = n(), .groups = "drop") %>%
  mutate(
    health = factor(health, levels = c("Poor", "Fair", "Good"))  
  )

# Plot data
ggplot(tree_data_filtered, aes(x = count, y = borough, fill = health)) +
  geom_bar(stat = "identity", position = "stack") +  
  scale_fill_manual(
    values = c("Poor" = "#F44336", "Fair" = "#FFC107", "Good" = "#4CAF50"),
    name = "Tree Health"
  ) +
  labs(
    title = "Tree Health Distribution by Borough",
    x = "Number of Trees",
    y = "Borough"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16),
    axis.text.x = element_text(size = 12),
    axis.text.y = element_text(size = 12),
    legend.title = element_text(face = "bold", size = 12))

Overall Tree Health

  • The majority of trees in all boroughs are classified as being in Good health (green segment), indicating a generally healthy urban forest in NYC.

Borough Comparison

  • Queens has the highest number of trees overall, with a significant portion in good health. It also has a noticeable proportion of trees in Fair health (yellow segment).
  • Staten Island and Bronx, though less in number than Brooklyn and Queens, have a high percentage of their trees in Good heal

Poor Health Distribution

  • Poor health: Red segment is the least category in all boroughs.
  • Manhattan has the highest proportion of trees in poor health relative to its total number of trees. This suggests potential urban stress factors like pollution or limited green spaces.

Brooklyn and Staten Island

  • Brooklyn has the second-highest total number of trees, following Queens. Most of the trees are in good health. Staten Island is the least in terms of number but shows a relatively balanced distribution in health categories in comparison with other boroughs.

Potential for Action

  • Manhattan and Queens are some boroughs that might need special treatment in enhancing the health status of their Fair- or Poor-rated trees since larger populations translate to larger stress factors.

3.5 Trunk Titans: Small vs. Mighty Trees

The Cleveland dot plot shows the average tree diameter (DBH) for various tree species, highlighting differences in growth patterns and size among species in NYC.

Code
# Aggregate mean diameter by species
species_avg <- tree_data %>%
  group_by(spc_common) %>%
  summarise(mean_dbh = mean(tree_dbh, na.rm = TRUE)) %>%
  arrange(desc(mean_dbh)) %>%
  slice(1:50) 

# Create the plot
ggplot(species_avg, aes(x = mean_dbh, y = reorder(spc_common, mean_dbh))) +
  geom_point(color = "blue", size = 3) +
  labs(
    title = "Average Tree Diameter by Species",
    x = "Average Diameter (DBH)",
    y = "Tree Species"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16),
    axis.text.y = element_text(size = 12),
    axis.text.x = element_text(size = 12),
    axis.title.x = element_text(face = "bold", size = 12),
    axis.title.y = element_text(face = "bold", size = 12)
  )

Top Species with Largest Average Diameters

  • Species such as London planetree, silver maple, and weeping willow are among those with the largest average diameters, with each having an average diameter greater than 16 DBH. These species have been characterized by fast growth and adaptation, leading to bigger tree sizes.

Species with Smallest Average Diameters

  • Species at the lower end of the spectrum, like Ohio buckeye, ginkgo, and American linden, are going to be closer to an 8 DBH average. These might be slower-growing species or ones less adapted to NYC conditions.

Insights for Urban Planning

  • Larger-diameter species, such as the London planetree, while requiring more space and other resources, give very substantial canopy coverage. In contrast, the smaller diameter species may work well in tighter spaces within the urban environment.

Species-Specific Growth Patterns

  • These differences in average diameter tells us about the growth characteristics according to the species, planting preferences, and environmental adaptability in NYC.

3.6 Paving the Way: Proportion of Sidewalks Affected by Trees

The pie chart illustrates the proportion of trees in NYC with adjacent sidewalk damage.

Code
# Calculate proportions
sidewalk_proportion <- tree_data %>%
  count(sidewalk) %>%
  mutate(prop = n / sum(n))

# Enhanced pie chart
ggplot(sidewalk_proportion, aes(x = "", y = prop, fill = sidewalk)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar(theta = "y") +
  geom_text(
    aes(label = scales::percent(prop, accuracy = 0.1)),
    position = position_stack(vjust = 0.5),
    color = "white",
    size = 5
  ) +
  labs(
    title = "Proportion of Trees with Sidewalk Damage",
    fill = "Sidewalk Condition"
  ) +
  theme_void() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 16),
    legend.position = "right",
    legend.title = element_text(size = 12, face = "bold"),
    legend.text = element_text(size = 10)
  ) +
  scale_fill_manual(values = c("Damage" = "#F44336", "NoDamage" = "#4CAF50"))

Majority with No Sidewalk Damage:

  • A significant share (71.5%) of the trees are indeed on sidewalks that are not reported to have visible damage.

Minority with Sidewalk Damage:

  • Around 28.5% of the trees are located on sidewalks reported to be showing signs of damage.

Urban Impact Insight:

  • Although most sidewalks are resistant to the damages related to trees, a significant number still experience problems, likely due to damage to pavement structures caused by tree roots.

Actionable Consideration:

  • one could strategize efforts at mitigating damages through improved tree planting or management techniques for roots that would minimize future sidewalk damages.

3.7 Pathways to Tree Health: Exploring Curb Placement, Sidewalk Conditions, and Their Impact

The alluvial plot visualizes the relationship between curb location, sidewalk damage, and tree health.

Code
# Prepare data for alluvial plot
alluvial_data <- tree_data %>%
  group_by(curb_loc, sidewalk, health) %>%
  summarise(count = n(), .groups = "drop")

# Alluvial plot with improved axis labels
ggplot(alluvial_data, aes(axis1 = curb_loc, axis2 = sidewalk, axis3 = health, y = count)) +
  geom_alluvium(aes(fill = health)) +
  geom_stratum() +
  geom_text(stat = "stratum", aes(label = after_stat(stratum)), size = 4) + 
  labs(
    title = "Flow of Trees from Curb Location to Sidewalk Damage to Health",
    x = "Tree Characteristics",
    y = "Number of Trees"
  ) +
  scale_fill_manual(values = c("Good" = "#4CAF50", "Fair" = "#FFC107", "Poor" = "#F44336")) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(hjust = 1, size = 12), 
    axis.text.y = element_text(size = 12), 
    axis.title = element_text(size = 12, face = "bold"), 
    plot.title = element_text(hjust = 0.5, size = 14, face = "bold"))

Curb Location

  • Most trees are located OnCurb, indicating that urban tree planting often aligns with curb locations.
  • Trees OffsetFromCurb represent a smaller proportion, likely in areas with wider sidewalks or designated tree beds.

Sidewalk Damage

  • Trees OnCurb are more associated with Sidewalk Damage. It is likely due to root growth interfering with pavement structures.
  • Trees OffsetFromCurb show a stronger association with NoDamage. This suggests reduced impact on sidewalks.

Tree Health

  • The majority of trees are categorized as Good, irrespective of their curb location or sidewalk condition.
  • Trees in Poor health are more prevalent where Sidewalk Damage is present, indicating that environmental stressors may contribute to declining health.

Relationships

  • There is a clear flow where trees OnCurb with Sidewalk Damage tend to be more Fair or Poor in health.
  • Trees OffsetFromCurb and with NoDamage mostly have Good health.

3.8 Uneven Growth: Tree Diameters and Sidewalk Struggles

The plot highlights the interplay between tree placement, sidewalk integrity, and tree health. Proper placement (e.g., OffsetFromCurb) could mitigate sidewalk damage and promote better tree health.

Code
ggplot(tree_data, aes(x = sidewalk, y = tree_dbh, fill = sidewalk)) +
  geom_violin() +
  labs(
    title = "Tree Diameter and Sidewalk Damage",
    x = "Sidewalk Condition",
    y = "Tree Diameter (DBH)"
  ) +
  scale_fill_manual(values = c("Damage" = "#F44336", "NoDamage" = "#4CAF50")) +
  coord_cartesian(ylim = c(0, 100)) +  # Adjust the y-axis limits to zoom in
  theme_minimal()

Distribution of Tree Diameters

  • Trees with sidewalk damage have a slightly wider spread of diameters compared to those without damage.
  • Most trees in both categories have diameters concentrated in the lower ranges, indicating smaller trees dominate the dataset.

Potential Correlation

  • Sidewalk damage seems slightly more prevalent for trees with larger diameters, as indicated by the broader shape of the violin for “Damage.”

Tree Size and Damage

  • Larger trees might exert more pressure on surrounding sidewalks due to their extensive root systems, contributing to damage.

NoDamage Category

  • Trees in the “NoDamage” category show a similar diameter distribution, suggesting other factors besides tree size might influence sidewalk integrity.

3.9 Bubble chart

The bubble chart offers several insights into the distribution of tree species and their health status across different boroughs in New York City.

Code
# Calculate the Top 5 Most Common Species
top_species <- tree_data %>%
  count(spc_common, sort = TRUE) %>%
  top_n(5, wt = n) %>%
  pull(spc_common) # Extract species names as a vector

# Prepare Data for Bubble Chart
bubble_data <- tree_data %>%
  group_by(borough, spc_common, health) %>%
  summarize(count = n(), .groups = "drop") %>%
  filter(spc_common %in% top_species) # Focus on top 5 species

# Bubble Chart
ggplot(bubble_data, aes(x = borough, y = spc_common, size = count, color = health)) +
  geom_point(alpha = 0.7) +
  scale_size_area(max_size = 15) +
  scale_color_manual(values = c(
    "Good" = "#27ae60", 
    "Fair" = "#f1c40f", 
    "Poor" = "#e74c3c"
  )) +
  labs(
    title = "Tree Species vs. Borough by Health",
    x = "Borough",
    y = "Species",
    size = "Tree Count",
    color = "Health Status"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", size = 16, hjust = 0.5),
    axis.text.x = element_text(angle = 45, hjust = 1),
    legend.position = "right"
  )

  1. Dominance of London Planetree:
    • The London planetree stands out as the most commonly planted species across all boroughs, evidenced by its larger bubble sizes. This aligns with its popularity as a resilient urban tree, often chosen for its ability to thrive in diverse environmental conditions.
  2. Health Trends Across Species:
    • Most trees across all species and boroughs are in good health (represented by the predominance of green bubbles). However, there are smaller proportions of trees in fair (yellow) or poor (red) health, indicating areas that may require targeted maintenance efforts.
  3. Borough-Specific Characteristics:
    • Manhattan has a noticeably high count of London planetrees in good health, making it a significant contributor to the city’s urban forest. Similarly, Brooklyn and Queens also show a strong presence of Callery pear and Norway maple, with most of these trees in good condition.
    • Staten Island, on the other hand, has fewer trees overall, as reflected in the smaller bubble sizes across all species. This could suggest either less dense tree planting efforts or smaller urban areas requiring greenery.
  4. Species in Poor Health:
    • A few instances of trees in poor health, particularly Norway maple in Queens, stand out in the visualization. These trees may require closer attention to improve their condition and ensure they continue contributing positively to the urban ecosystem.
  5. Species Diversity:
    • While the London planetree dominates, other species such as Callery pear and honeylocust also have significant representation. This diversity is particularly evident in boroughs like Queens, which seem to have a more balanced mix of species compared to other boroughs.

3.10 How Tree Diameter and Problem Types Affect Health Across Boroughs

Code
# Prepare Data for Scatter Plot
scatter_data <- tree_data %>%
  filter(tree_dbh > 0) %>%
  pivot_longer(
    cols = starts_with("root") | starts_with("trunk") | starts_with("brch"), 
    names_to = "problem_type", 
    values_to = "has_problem"
  ) %>%
  filter(!is.na(has_problem) & has_problem == "Yes")

ggplot(scatter_data, aes(x = tree_dbh, y = health, color = borough)) +
  geom_jitter(alpha = 0.3, size = 1.5) +
  facet_wrap(~problem_type, ncol = 4, nrow = 2, scales = "free_y") + # 4 columns and 2 rows
  scale_x_continuous(
    trans = scales::log_trans(base = 2),
    breaks = c(1, 2, 4, 8, 16, 32, 64), # Log2 breaks
    labels = c("1", "2", "4", "8", "16", "32", "64")
  ) +
  scale_color_brewer(palette = "Set2") +
  labs(
    title = "Tree Diameter vs. Health by Problem Type",
    x = "Tree Diameter (DBH) (Log2 Scale)",
    y = "Health Status",
    color = "Borough"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(face = "bold", size = 16, hjust = 0.5),
    legend.position = "top",
    strip.text = element_text(face = "bold"),
    axis.text.x = element_text(angle = 45, hjust = 1)
  )

  • Trees with root-related problems (root_grate, root_other, root_stone) display a significant decline in health as their diameter (DBH) increases.
  • Trees larger than 16 inches (DBH) show a higher proportion of “Fair” and “Poor” health statuses compared to smaller trees.
  • This pattern is most prominent in boroughs like Brooklyn and Staten Island, which have a greater number of larger trees and infrastructure-related stressors.
  • Root-related problems, such as interference from grates, stones, and soil compaction, are particularly impactful for larger trees, likely due to their greater resource requirements and restricted growing conditions in urban environments.

We can get intutiton that:

  • Larger Trees Are Under Threat:
    • Larger trees, especially those exceeding 16 inches in diameter, are critical to NYC’s urban canopy. They provide a range of ecological benefits, including carbon sequestration, air purification, cooling through shade, and improved biodiversity. However, the data shows they are increasingly vulnerable to health issues, particularly root-related stress.
    • Root issues, including limited space for root expansion, interference from grates, and urban soil compaction, disrupt nutrient absorption and overall stability, contributing to a decline in health.
  • Brooklyn and Staten Island as Vulnerable Zones:
    • These boroughs host a broader distribution of larger trees, making them key areas where root-related challenges are more prevalent. Larger trees in these boroughs are often subject to urban stressors due to aging infrastructure and limited urban planning geared toward tree preservation.
    • The prevalence of root issues in these boroughs highlights the need for borough-specific interventions, such as redesigning urban layouts and expanding tree planting zones.

3.12 Interactive Visualization of Tree Health and Distribution in NYC Boroughs

The map visualization provides a detailed and intuitive representation of tree health across New York City boroughs, allowing us to draw several key observations:

Code
invisible(
  capture.output(
    nyc_boroughs <- tigris::counties(state = "NY", cb = TRUE) %>% 
      filter(NAME %in% c("New York", "Kings", "Queens", "Bronx", "Richmond"))
  )
)
Retrieving data for the year 2022
Code
sampled_tree_data <- tree_data %>% sample_n(5000)

leaflet(sampled_tree_data) %>%

  addProviderTiles(providers$CartoDB.Positron) %>%
  addPolygons(data = nyc_boroughs, 
              color = "#2c3e50", 
              weight = 2, 
              fillColor = "#ecf0f1", 
              fillOpacity = 0.3, 
              label = ~NAME) %>%
  
  # Add Circle Markers for Tree Data
  addCircleMarkers(lng = ~longitude, 
                   lat = ~latitude, 
                   radius = ~ifelse(tree_dbh > 20, 6, 3), # Tree size based on diameter
                   color = ~case_when(
                     health == "Good" ~ "#27ae60",   # Green for "Good"
                     health == "Fair" ~ "#f1c40f",   # Yellow for "Fair"
                     health == "Poor" ~ "#e74c3c",   # Red for "Poor"
                     TRUE ~ "#bdc3c7"                # Gray if health is missing
                   ),
                   stroke = TRUE, 
                   weight = 0.7, 
                   fillOpacity = 0.8,
                   popup = ~paste0(
                     "<strong>Species: </strong>", spc_common, 
                     "<br><strong>Health: </strong>", health, 
                     "<br><strong>Status: </strong>", status, 
                     "<br><strong>Diameter (DBH): </strong>", tree_dbh, 
                     "<br><strong>Borough: </strong>", borough
                   )) %>%
  
  # Cluster the markers to avoid overcrowding
  addMarkers(lng = ~longitude, 
             lat = ~latitude, 
             clusterOptions = markerClusterOptions()) %>%
  
  # Borough Legend
  addLegend(position = "topright", 
            colors = c("#2c3e50"), 
            labels = c("Borough Boundaries"), 
            title = "Map Key", 
            opacity = 0.8) %>%
  
  # Health Legend
  addLegend(position = "bottomright", 
            colors = c("#27ae60", "#f1c40f", "#e74c3c"), 
            labels = c("Good Health", "Fair Health", "Poor Health"), 
            title = "Tree Health", 
            opacity = 0.8)
  1. Health Distribution:
    • A large majority of the trees sampled are in good health, as indicated by the prevalence of green markers across the map.
    • A smaller proportion of trees are classified as fair health (yellow markers), while poor health trees (red markers) are relatively sparse but concentrated in specific areas.
  2. Geographical Patterns:
    • Manhattan and Brooklyn: These boroughs have a significant density of trees, as evidenced by the clustering of markers, especially in parks and green corridors. Poor health trees appear more scattered but can be seen in some heavily urbanized regions.
    • Queens: Queens shows widespread distribution of trees, with clusters of healthy trees around residential and park areas. A few problem zones with poor health trees can be observed but are less pronounced.
    • Bronx and Staten Island: While the Bronx has several clusters of trees in good health, Staten Island exhibits fewer clusters overall, likely reflecting its lower urban density. Staten Island still maintains a good balance of tree health.
  3. Tree Diameter Clusters:
    • Larger trees (radius indicating tree diameter) are more common in park areas and green belts, as expected. This is consistent with the ecological protection and space availability in such regions.
  4. Tree Health Clustering:
    • The clustering feature reveals specific areas where tree health issues (red markers) might require attention. These could be areas affected by urban stressors like pollution, soil compaction, or limited care.
  5. Borough-Level Efforts:
    • The map highlights the borough-level differences in tree density and health distribution. For instance, Queens and Brooklyn have both high density and predominantly healthy trees, likely due to better urban forestry practices or ecological planning.