# A tibble: 2 × 23
...1 ...2 ...3 ...4 ...5 ...6 ...7 ...8 ...9 ...10 ...11 ...12 ...13
<lgl> <dbl> <lgl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <lgl> <chr> <dbl> <dbl>
1 NA NA NA State… NA NA NA NA NA NA Anno… NA NA
2 NA 2022 NA 2025 2030 2035 2040 2045 2050 NA 2025 2030 2035
# ℹ 10 more variables: ...14 <dbl>, ...15 <dbl>, ...16 <dbl>, ...17 <lgl>,
# ...18 <chr>, ...19 <dbl>, ...20 <dbl>, ...21 <dbl>, ...22 <dbl>,
# ...23 <dbl>
sheet_header_processed <- sheet_header |># transpose the datat() |># turn it back into a tibbleas_tibble() |># make them meaningfulrename(scenario = V1, year = V2) |># fill scenario downfill(scenario) |>#insert "Current" at topreplace_na(list(scenario ="Current Year"))
Warning: The `x` argument of `as_tibble.matrix()` must have unique column names if
`.name_repair` is omitted as of tibble 2.0.0.
ℹ Using compatibility `.name_repair`.
sheet_header_processed
# A tibble: 23 × 2
scenario year
<chr> <chr>
1 Current Year <NA>
2 Current Year 2022
3 Current Year <NA>
4 Stated policies scenario 2025
5 Stated policies scenario 2030
6 Stated policies scenario 2035
7 Stated policies scenario 2040
8 Stated policies scenario 2045
9 Stated policies scenario 2050
10 Stated policies scenario <NA>
# ℹ 13 more rows
# A tibble: 23 × 3
scenario year mineral_info_col_names
<chr> <chr> <chr>
1 Current Year <NA> ...1
2 Current Year 2022 ...2
3 Current Year <NA> ...3
4 Stated policies scenario 2025 ...4
5 Stated policies scenario 2030 ...5
6 Stated policies scenario 2035 ...6
7 Stated policies scenario 2040 ...7
8 Stated policies scenario 2045 ...8
9 Stated policies scenario 2050 ...9
10 Stated policies scenario <NA> ...10
# ℹ 13 more rows
read_iea_mineral_table <-function(mineral_name_range, mineral_info_range) { mineral_name <-read_key_minerals_sheet(range = mineral_name_range) |>pull() mineral_info <-read_key_minerals_sheet(range = mineral_info_range) mineral_info_col_names <-names(mineral_info) mineral_info_long <- mineral_info |>rename(indicator =`...1`) |>pivot_longer(cols =-indicator,names_to ="mineral_info_col_names") |>add_column(mineral_name) combined_data <- mineral_info_long |>left_join(sheet_headers_and_col_names, by =join_by(mineral_info_col_names)) |># filter out what were empty columns (where years are NA)filter(!is.na(year)) |># case_when is supercharged if elsemutate(unit =case_when( indicator =="Share of clean technologies in total demand"~"Percent",.default ="kiloton" ),# convert the year column from character to numericyear =as.integer(year) ) |>select(mineral_name, indicator, scenario, unit, year, value) combined_data }copper_table <-read_iea_mineral_table(mineral_name_range ="A7",mineral_info_range ="A8:W18")
library(ggplot2)library(dplyr)# Load the datasetdata <-read.csv("/Users/enmingliang/Desktop/data-raw/iea_total_demand_for_critical_minerals.csv")# Ensure your dataset has 'mineral_name', 'scenario', 'year', and 'value' columnsfiltered_data <- data %>%filter(mineral_name %in%c("Copper", "Cobalt"))# Optionally, you can add more filters for specific scenarios or years# Creating the line chart correctlyggplot(filtered_data, aes(x = year, y = value, color = scenario, group = scenario)) +# Note the comma heregeom_line() +facet_wrap(~mineral_name, scales ="free_y") +# Creates separate plots for Copper and Cobalttheme_minimal() +labs(title ="Demand Trends for Copper and Cobalt Under Different Scenarios",x ="Year",y ="Demand (metric tons)",color ="Scenario")
#Visualization 1: Scenario Comparison#The model uses a line chart to visualize how the demand for copper and cobalt changes over time under different future scenarios. Each line represents a scenario, showing how policy and technology might influence mineral demand.#Lines: Each line tracks demand for a mineral under a specific future scenario.#Purpose: Identify how different scenarios affect mineral demand.
copper_cobalt_data <- data %>%filter(mineral_name %in%c("Copper", "Cobalt"))# Aggregate data to get average demand per scenario for each mineralavg_demand_by_scenario <- copper_cobalt_data %>%group_by(mineral_name, scenario) %>%summarise(avg_demand =mean(value))
`summarise()` has grouped output by 'mineral_name'. You can override using the
`.groups` argument.
# Plotting the average demand by scenarioggplot(avg_demand_by_scenario, aes(x = scenario, y = avg_demand, fill = mineral_name)) +geom_bar(stat ="identity", position ="dodge") +theme_minimal() +labs(title ="Average Demand by Scenario",x ="Scenario",y ="Average Demand (kiloton)",fill ="Mineral") +theme(axis.text.x =element_text(angle =45, hjust =1))
#Visualization 2: Scenario Comparison#Purpose: To compare the impact of different policy and technological scenarios on the average demand for copper and cobalt.#Explanation: By calculating the average demand under each scenario and plotting these averages in a bar chart, this visualization highlights which scenarios lead to higher or lower demand for each mineral.#Comments: This comparison provides a straightforward way to assess the relative impact of scenarios, helping stakeholders understand which conditions could lead to increased demand and, by extension, potential supply challenges or investment opportunities.
# Plotting the demand by applicationggplot(copper_cobalt_data, aes(x = indicator, y = value, fill = scenario)) +geom_bar(stat ="identity", position ="dodge") +facet_wrap(~mineral_name, scales ="free_y") +theme_minimal() +labs(title ="Demand for Copper and Cobalt by Application",x ="Application",y ="Demand (kiloton)",fill ="Scenario") +theme(axis.text.x =element_text(angle =45, hjust =1))
#Visualization 3: Demand by Application#Purpose: To identify which technologies or applications drive the demand for copper and cobalt.#Explanation: This bar chart breaks down demand by application (e.g., Solar PV, Wind, EVs) for each mineral, showing how different uses contribute to overall demand under various scenarios.#Comments: Understanding demand drivers is essential for pinpointing where investments in technology or infrastructure might be most needed or most impactful. This insight helps in aligning strategy with future market conditions.
# Comparing the demand for Copper and Cobaltggplot(copper_cobalt_data, aes(x = year, y = value, color = mineral_name)) +geom_line() +facet_wrap(~scenario, scales ="free_y") +theme_minimal() +labs(title ="Copper vs Cobalt: Demand Comparison Across Scenarios",x ="Year",y ="Demand (kiloton)",color ="Mineral")
#Visualization 4: Mineral Comparison#Purpose: To directly compare the demand trajectories for copper and cobalt across different scenarios.#Explanation: This line plot juxtaposes the demand for copper against cobalt over the years, within each scenario. It visually represents how each mineral's demand responds to policy and technological developments.#Comments: Comparing these minerals side by side allows for a nuanced understanding of their market dynamics, highlighting potential areas of concern or opportunity in raw material supply chains.
# Calculating yearly growth ratescopper_cobalt_growth <- copper_cobalt_data %>%arrange(mineral_name, scenario, year) %>%group_by(mineral_name, scenario) %>%mutate(growth_rate = (value /lag(value) -1) *100) %>%# Removing the first year for each scenario since it won't have a growth ratefilter(!is.na(growth_rate))# Plotting the growth ratesggplot(copper_cobalt_growth, aes(x = year, y = growth_rate, color = scenario)) +geom_line() +facet_wrap(~mineral_name, scales ="free_y") +theme_minimal() +labs(title ="Yearly Growth Rates in Demand for Copper and Cobalt",x ="Year",y ="Growth Rate (%)",color ="Scenario")
#Visualization 5: Yearly Growth Rates#Purpose: To analyze the annual changes in demand for copper and cobalt, indicating acceleration or deceleration in growth.#Explanation: By calculating and plotting the yearly growth rates, this visualization shows how demand growth varies year over year, offering insights into demand momentum under different scenarios.#Comments: Growth rates are a key indicator of market health and can signal impending shifts in demand. This analysis is crucial for timing investments, expansions, or policy interventions.