# Create a mock dataset for crime in Bangladesh (2000–2024)
set.seed(123)
years <- 2000:2024
crime_types <- c("Murder", "Rape", "Robbery", "Mob Violence", "Vandalism", "Psycho-killing")
statuses <- c("Solved", "Unsolved", "Closed", "Replicated")
crime_data <- expand.grid(
year = years,
crime_type = crime_types,
status = statuses
)
crime_data$total_cases <- sample(20:500, nrow(crime_data), replace = TRUE)
# Preview
head(crime_data)
## year crime_type status total_cases
## 1 2000 Murder Solved 434
## 2 2001 Murder Solved 482
## 3 2002 Murder Solved 198
## 4 2003 Murder Solved 33
## 5 2004 Murder Solved 214
## 6 2005 Murder Solved 445
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
summary_plot <- crime_data %>%
group_by(year, crime_type) %>%
summarise(total = sum(total_cases))
## `summarise()` has grouped output by 'year'. You can override using the
## `.groups` argument.
ggplot(summary_plot, aes(x = year, y = total, color = crime_type)) +
geom_line(size = 1, alpha = 0.8) +
labs(title = "Trends in Crime Types in Bangladesh (2000–2024)",
x = "Year", y = "Total Cases") +
theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

library(plotly)
## Warning: package 'plotly' was built under R version 4.4.3
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
ggplotly()
library(gganimate)
## Warning: package 'gganimate' was built under R version 4.4.3
anim <- ggplot(crime_data, aes(x = crime_type, y = total_cases, fill = status)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Crime Status by Type",
subtitle = "Year: {frame_time}",
x = "Crime Type", y = "Number of Cases") +
transition_time(year) +
ease_aes("linear") +
theme_minimal()
animate(anim, renderer = gifski_renderer())

anim_save("crime_animation.gif", animation = last_animation())