Visualising the Heavens

An Interactive Spatio-Temporal Visualization of Meteorites Discoveries

Author

Data Dynamos - Deema, Rahul, Swati, Ansh & Shakir

Abstract

Journey into the depths of our solar system and unveil the hidden realm of meteorites, often overlooked as mere space wanderers. These celestial nomads, scattered across the cosmos, hold the keys to unlocking the mysteries of our solar system’s origins. In our latest endeavor, we introduce an interactive website dedicated to exploring these fascinating celestial bodies, drawing from discoveries collected by Javier de la Torre.

Astronomy enthusiasts and the wider public alike will find our website to be an educational and immersive tool. Users can explore diverse facets of meteorite discoveries through interactive visualizations, accessing information such as names, IDs, name types, recclass classifications, masses measured in grams, fall occurrences, discovery years, reclat (latitude of the landing site), relong (longitude of the landing site), and exact geolocations. Our project utilizes data from NASA’s comprehensive Meteorite Landings dataset, encompassing 34,513 meteorites. These meteorites are an integral part of our cosmic history, offering a window into the profound mysteries of our solar system’s evolution. Join us on this celestial odyssey and rediscover the wonders of meteorites.

Introduction

Meteorites act as cosmic time capsules, preserving the mysteries of our solar system’s formation. These celestial travelers have voyaged through space, bearing witness to ancient cosmic events, their rocky surfaces preserving stories of our cosmic past. Scattered across the universe, these wanderers hold untold narratives that illuminate the genesis of our solar system. Our latest venture introduces an interactive online platform, drawn from Javier de la Torre’s dataset Meteorite Landings which is taken from NASA’s website, dedicated to unveiling the captivating world of these celestial marvels. Our objective is to present an interactive visualization spotlighting the annual distribution of meteorite falls across diverse global regions.

Our dataset encompasses 45,716 meteorites, offering essential insights including name for meteorite identification, recclass denoting its classification, mass (g) providing mass specifics, fall characterizing the status of descent, year signifying the landing date, and reclat and reclong pinpointing latitude and longitude and precise geolocation. Using this data, our main goal is to build an interactive exhibit showing the yearly trends of meteorite falls globally. This aims to vividly depict how these celestial travelers have significantly impacted Earth’s history. It also enables a comprehensive comprehension of how these celestial remains are dispersed, their concentration, and their diverse sizes.

Approach

In our Shiny app, we’ve integrated three primary visualizations: a world map, a density map, and a bubble map, each depicting the meteorite landings across various regions over time. These visual representations offer distinct insights into the geographical distribution, concentration density, and mass significance of meteorite impacts. We initiated data exploration to extract relevant information and identify interesting details. The overall plan involves initially preparing and processing the data, followed by creating comprehensive visualizations. These visualizations are then seamlessly integrated into the Shiny app, providing an interactive user experience.

Data Read
meteorite = read_csv("https://raw.githubusercontent.com/INFO526-DataViz/project-final-Data-Dynamos/main/data/Meteorite_Landings.csv")
Rows: 45716 Columns: 10
── Column specification ──────────────────────────────────────────────
Delimiter: ","
chr (5): name, nametype, recclass, fall, GeoLocation
dbl (4): id, year, reclat, reclong
num (1): mass (g)

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Data Read
meteorite
# A tibble: 45,716 × 10
   name             id nametype recclass `mass (g)` fall   year reclat
   <chr>         <dbl> <chr>    <chr>         <dbl> <chr> <dbl>  <dbl>
 1 Aachen            1 Valid    L5               21 Fell   1880   50.8
 2 Aarhus            2 Valid    H6              720 Fell   1951   56.2
 3 Abee              6 Valid    EH4          107000 Fell   1952   54.2
 4 Acapulco         10 Valid    Acapulc…       1914 Fell   1976   16.9
 5 Achiras         370 Valid    L6              780 Fell   1902  -33.2
 6 Adhi Kot        379 Valid    EH4            4239 Fell   1919   32.1
 7 Adzhi-Bogdo …   390 Valid    LL3-6           910 Fell   1949   44.8
 8 Agen            392 Valid    H5            30000 Fell   1814   44.2
 9 Aguada          398 Valid    L6             1620 Fell   1930  -31.6
10 Aguila Blanca   417 Valid    L              1440 Fell   1920  -30.9
# ℹ 45,706 more rows
# ℹ 2 more variables: reclong <dbl>, GeoLocation <chr>

In our approach for preparing and processing the data, we first ensured the necessary libraries were loaded using the pacman package in R. After importing the data, we began the pre-processing phase. This involved renaming certain columns and eliminating irrelevant columns like ‘nametype’ and fall. Furthermore, we introduced a new column, decade, to categorize meteorite landings based on their respective years. This meticulous process aimed to refine the dataset, setting the groundwork for subsequent analysis and visualization steps.

Data Pre-Processing
# Rename columns using dplyr::rename
meteorite <- na.omit(meteorite) |>
 clean_names() |>
 rename(mass = mass_g, class= recclass)

#Selecting columns where mass >1 gram
meteorite <- subset(meteorite, mass >= 1)

# Drop unnecessary columns
meteorite <- meteorite[, !(names(meteorite) %in% c("nametype", "fall"))]

# Create the 'decade' column
meteorite <- meteorite %>%
  mutate(decade = case_when(
    year < 1950 ~ "Before 1950",
    between(year, 1951, 1960) ~ "Decade 1951-1960",
    between(year, 1961, 1970) ~ "Decade 1961-1970",
    between(year, 1971, 1980) ~ "Decade 1971-1980",
    between(year, 1981, 1990) ~ "Decade 1981-1990",
    between(year, 1991, 2000) ~ "Decade 1991-2000",
    between(year, 2001, 2010) ~ "Decade 2001-2010",
    between(year, 2011, 2020) ~ "Decade 2011-2020",
    TRUE ~ "NA"  # Default case if none of the conditions are met
  ))

The sf package is employed to showcase the locations of meteorite landings on a global map. It begins by tabulating meteorites on an annual basis. Subsequently, the ne_countries() function from the rnaturalearth package is employed to construct a world map, specifying the desired scale normal and return class. The geom_sf() function is then applied to layer this map, visually depicting meteorite impacts with longitude and latitude coordinates.

Point plot:

Our question for this visual is:

1). Which continents appear to have the highest density of meteorite impacts based on the data visualized in the provided plot?

Point plot of meteorite impact
#####Point plot of meteor#####

# Count meteorites per year
meteor_count <- table(meteorite$Year)

# Create a world map
world <- ne_countries(scale = "medium", returnclass = "sf")

# Plot meteorite impacts on the map
p1 <- ggplot() +
  geom_sf(data = world, fill = "lightgrey") +
  geom_point(data = meteorite, aes(x = reclong, y = reclat), color = "red", size = 1, alpha = 0.5) +
  labs(title = "World Map: Meteorite Impacts\n",
       x = NULL,
       y = NULL) +
  theme_minimal() +
  theme(
    plot.title = element_text(size = 20),
    axis.text = element_text(size = 14)
  )

# Set custom plot size for R Studio display
knitr::opts_chunk$set(fig.width = 12, fig.height = 8)

# Display the plot
print(p1)

Observation:

  • High Impact Density: Europe and North America show a high density of meteorite impacts.

  • Moderate Impact Density: Parts of Asia and Africa display a moderate concentration of impacts.

  • Lower Impact Density: South America and Australia have fewer impacts compared to Europe and North America.

  • Minimal Impact Reporting: Antarctica has the least number of recorded impacts, potentially due to underreporting.

Density plot:

2). What does the thermal map suggest about the geographical distribution of meteorite impacts across the world?

We created a thermal density map illustrating the concentration of meteorite impacts across various geographical locations. Using the ne_countries() function from the rnaturalearth package, we generated a world map with a medium scale and specified return class. These maps were then overlaid with density contours formed by the geom_density_2d() function, visually depicting the meteorite impact density based on longitude and latitude coordinates.

Thermal density plot
#####THERMAL DENSITY MAP##### 

# Count meteorites per year
meteor_count <- table(meteorite$year)

# Create a world map
world <- ne_countries(scale = "medium", returnclass = "sf")

# Plot meteorite impacts on the map with density color scale
p2 <- ggplot() +
  geom_sf(data = world, fill = "lightgrey") +
  geom_density_2d(data = meteorite, aes(x = reclong, y = reclat), color= "red") +
  labs(title = "Thermal Map: Meteorite Impacts Density",
       x=NULL,
       y=NULL) +
  theme_minimal()+
  theme(
    plot.title = element_text(size = 20),
    axis.text = element_text(size = 14)
  )

# Display the plot
print(p2)

Observation:

  • Concentrated Zones: The map highlights areas with a significant concentration of meteorite impacts through thermal rings.

  • Major Impact Regions: Regions with the densest meteorite activity include parts of North America, Europe, and Asia.

  • Secondary Impact Zones: Lesser concentrations are visible in South America, Africa, and Australia. Oceans and Antarctica: The map shows minimal impact activity in the oceans and Antarctica. Data

  • Interpretation: The thermal rings suggest areas where meteorites are most commonly found or reported. Reporting Bias: The concentration of impacts may be influenced by the ease of meteorite discovery and reporting mechanisms in different regions.

Bubble plot:

3). How does the mass of meteorites vary across different regions of the world?

We have constructed a bubble map showcasing meteorite mass distribution across various geographic locations. It integrates a world map as the base layer using geom_sf(), and then plots meteorite landings as individual points. Each point’s size represents the meteorite’s mass, creating a bubble map effect to visualize mass distribution.

Bubble plot
#####BUBBLE PLOT#####

#Point plot with variable size to show the variable size of the meteor based on mass of mteor
ggplot() +
  geom_sf(data = world, fill = "lightgrey") +
  geom_point(data = meteorite, aes(x = reclong, y = reclat, size = mass), color = "blue", alpha = 0.5) +
  labs(title = "Bubble Map of Meteorite Mass",
       x="Longitude",
       y="Latitude") +
  theme_minimal()+
  theme(
    plot.title = element_text(size = 20),
    axis.text = element_text(size = 14)
  )+
  scale_size_continuous(labels = function(x) 
                                 scales::number_format(scale = 1e-6,
                                 suffix = "M (g)")(x) |>
  str_replace_all("\\.", ","))

Observation:

  • Variation in Mass: The map shows a variation in meteorite mass with some regions exhibiting larger meteorites than others.

  • Larger Meteorites: Regions with notably larger meteorites, as indicated by bigger bubbles, include parts of North America, Europe, and Asia. Smaller Meteorites:

  • Smaller meteorites, represented by smaller bubbles, are widely scattered across all continents.

  • Mass Concentration: There is a concentration of larger meteorite masses in the northern hemisphere.

  • Oceanic Impacts: Fewer large meteorites are noted in the oceans, likely due to the difficulty in discovering them.

R Shiny app integration:

The Shiny app integrates user interaction with visual representations to enable a comprehensive exploration of meteorite impacts over different periods and mass ranges. It includes diverse visualizations like World Maps, Density Maps, and Bubble Maps, displaying the geographical spread, size, and density of meteorite impacts. Users have the option to choose specific criteria like year ranges and meteorite mass through sliders. Drop down menus are integrated to select different map types, allowing the app to dynamically update the visualizations. This provides a comprehensive view of meteorite impacts on a global scale.

Link of app hosting on shiny.io: Meteor Impact Visualization

R Shiny app code
# Read meteorite data
meteorite <- read_csv("https://raw.githubusercontent.com/INFO526-DataViz/project-final-Data-Dynamos/main/data/Meteorite_Landings.csv")

# Rename columns using dplyr::rename
meteorite <- na.omit(meteorite) %>%
  clean_names() %>%
  rename(mass = mass_g, class = recclass)

# Selecting columns where mass > 1 gram
meteorite <- subset(meteorite, mass >= 1)

# Drop unnecessary columns
meteorite <- meteorite[, !(names(meteorite) %in% c("nametype", "fall"))]

# Create the 'decade' column
meteorite <- meteorite %>%
  mutate(decade = case_when(
    year < 1950 ~ "Before 1950",
    between(year, 1951, 1960) ~ "Decade 1951-1960",
    between(year, 1961, 1970) ~ "Decade 1961-1970",
    between(year, 1971, 1980) ~ "Decade 1971-1980",
    between(year, 1981, 1990) ~ "Decade 1981-1990",
    between(year, 1991, 2000) ~ "Decade 1991-2000",
    between(year, 2001, 2010) ~ "Decade 2001-2010",
    between(year, 2011, 2020) ~ "Decade 2011-2020",
    TRUE ~ "NA"  # Default case if none of the conditions are met
  ))

# Create a world map
world <- ne_countries(scale = "medium", returnclass = "sf")

# Define UI for the Shiny app
ui <- fluidPage(
  theme = shinytheme("darkly"),
  titlePanel("Meteorite Impact Visualization"),
  sidebarLayout(
    sidebarPanel(
      sliderInput("year_range", "Select Year Range:",
                  min = min(meteorite$year), max = max(meteorite$year),
                  value = c(min(meteorite$year), max(meteorite$year)),
                  step = 1),
      sliderInput("mass_range", "Select Mass Range (g):",
                  min = min(meteorite$mass), max = max(meteorite$mass),
                  value = c(min(meteorite$mass), max(meteorite$mass)),
                  step = 1),
      selectInput("plot_type", "Select Plot Type:",
                  choices = c("Point Plot", "Thermal Density Map", "Bubble Plot"),
                  selected = "Point Plot")
    ),
    mainPanel(
      plotOutput("meteor_map")
    )
  )
)

# Server for Shiny app
server <- function(input, output) {
  # Filter data based on user input
  filtered_data <- reactive({
    meteorite %>%
      filter(year >= input$year_range[1], year <= input$year_range[2],
             mass >= input$mass_range[1], mass <= input$mass_range[2])
  })

  # Function to create Point Plot
  create_point_plot <- function(data) {
    ggplot() +
      geom_sf(data = world, fill = "lightgrey") +
      geom_point(data = data, aes(x = reclong, y = reclat), color = "red", size = 1, alpha = 0.5) +
      labs(title = "World Map: Meteorite Impacts\n",
           x = "Longitude",
           y = "Latitude") +
      theme_minimal() +
      theme(
        plot.title = element_text(size = 14),
        axis.text = element_text(size = 8)
      )
  }

  # Function to create Thermal Density Map
  create_density_map <- function(data) {
    ggplot() +
      geom_sf(data = world, fill = "lightgrey") +
      geom_density_2d(data = data, aes(x = reclong, y = reclat), color = "red") +
      labs(title = "Thermal Map: Meteorite Impacts Density",
           x = "Longitude",
           y = "Latitude") +
      theme_minimal() +
      theme(
        plot.title = element_text(size = 14),
        axis.text = element_text(size = 8)
      )
  }

  # Function to create Bubble Plot
  create_bubble_plot <- function(data) {
    ggplot() +
      geom_sf(data = world, fill = "lightgrey") +
      geom_point(data = data, aes(x = reclong, y = reclat, size = mass), color = "blue", alpha = 0.5) +
      labs(title = "Bubble Map of Meteorite Mass",
           x = "Longitude",
           y = "Latitude") +
      theme_minimal() +
      theme(
        plot.title = element_text(size = 14),
        axis.text = element_text(size = 8)
      ) +
      scale_size_continuous(labels = function(x)
        scales::number_format(scale = 1e-6,
                               suffix = "M (g)")(x) |>
        str_replace_all("\\.", ","))
  }

  # Define the reactive plot
  output$meteor_map <- renderPlot({
    data <- filtered_data()
    plot_type <- input$plot_type

    if (plot_type == "Point Plot") {
      create_point_plot(data)
    } else if (plot_type == "Thermal Density Map") {
      create_density_map(data)
    } else if (plot_type == "Bubble Plot") {
      create_bubble_plot(data)
    }
  })
}

# Run the Shiny app
#shinyApp(ui, server)

Discussion

Point Plot:

The point plot reveals intriguing patterns in meteorite impacts across the globe. High impact density is evident in Europe and North America, suggesting these regions experience more frequent meteorite strikes. In contrast, South America and Australia exhibit lower impact density, indicating regional variations in meteorite activity. Notably, Antarctica shows the least number of recorded impacts, possibly due to challenges in reporting and the remote nature of the continent.

2D Density Plot:

The 2D density plot provides a thermal map of meteorite impacts, emphasizing concentrated zones and major impact regions. Thermal rings highlight areas with a significant concentration of meteorite impacts, such as parts of North America, Europe, and Asia. Secondary impact zones are visible in South America, Africa, and Australia. The plot also underscores minimal impact activity in oceans and Antarctica, raising questions about reporting biases and the true occurrence of impacts in these remote areas.

Bubble Plot:

The bubble plot offers insights into the size distribution of meteorites based on mass. Regions with larger meteorites, represented by bigger bubbles, include parts of North America, Europe, and Asia. In contrast, smaller meteorites are widely scattered across all continents. The concentration of larger meteorite masses in the northern hemisphere is notable, suggesting regional differences in meteorite mass distribution. Additionally, fewer large meteorites are observed in the oceans, underscoring the challenges of discovering and studying oceanic impact events.

Overall Observations

These visualizations collectively provide a comprehensive understanding of global meteorite impacts. The point plot highlights regional variations in impact density, the 2D density plot reveals concentrated and secondary impact zones, and the bubble plot illustrates size distribution patterns. Interpretations encompass reporting biases, regional differences in impact occurrences, and the challenges associated with studying meteorite impacts in remote or oceanic areas. Together, these findings contribute to a nuanced exploration of meteorite impact dynamics on Earth.

Future Scope

  • Introducing a feature that allows users to access in-depth meteorite details simply by hovering over impact sites on the map.

  • This enhancement will provide immediate access to essential specifics such as meteorite names, formation years, and other crucial attributes, facilitating deeper insights into each meteorite.

  • Incorporation of a density column, so that we can calculate the terminal velocity. This column combined with the mass of the meteorite can help us calculate the crater size it would form on impact. We can then play around with dynamic visuals showing meteor impact on Earth in the form of an animation.