iNaturalist Introduced Bubble Plot
Code to make this figure is below and can be downloaded here: Change the place_id and the place_name to your place of interest. Find your place ID from the iNaturalist search function, when you search your location name in the search bar, like “Fairfax County”, the resulting url has the place name in the url (ex. for the url https://www.inaturalist.org/observations?place_id=738 the place name is 738)
#install.packages("tidyverse", "devtools", "ggraph", "packcircles")
#library(devtools)
#devtools::install_github("hrbrmstr/curlconverter")
library(curlconverter)
library(tidyverse)
library(ggraph)
library(packcircles)
place_id <- 744
place_name <- "PWC"
iconic_name <- NULL
name <- NULL
common <- NULL
api <- paste("curl -X GET --header 'Accept: application/json' 'https://api.inaturalist.org/v1/observations?endemic=false&geo=true&introduced=true&place_id='", place_id, "&quality_grade=research&per_page=200&order=desc&order_by=created_at'", sep = "")
my_ip <- straighten(api) %>%
make_req()
dat <- content(my_ip[[1]](), as="parsed")
for(i in 1:length(dat$results)){
iconic_name <- c(iconic_name, dat$results[[i]]$taxon$iconic_taxon_name)
name <- c(name,dat$results[[i]]$taxon$name)
if(is.null(dat$results[[i]]$taxon$preferred_common_name)){
common <- c(common, NA)}else{
common <- c(common, dat$results[[i]]$taxon$preferred_common_name)}
}
if (dat$total_results > 200){
for (i in 2:floor(dat$total_results/200)){
api <- paste("curl -X GET --header 'Accept: application/json' 'https://api.inaturalist.org/v1/observations?endemic=false&geo=true&introduced=true&place_id='", place_id, "&quality_grade=research&page=", i, "&per_page=200&order=desc&order_by=created_at'", sep = "")
my_ip <- straighten(api) %>%
make_req()
dat <- content(my_ip[[1]](), as="parsed")
for(j in 1:length(dat$results)){
iconic_name <- c(iconic_name, dat$results[[j]]$taxon$iconic_taxon_name)
name <- c(name,dat$results[[j]]$taxon$name)
if(is.null(dat$results[[j]]$taxon$preferred_common_name)){
common <- c(common, NA)}else{
common <- c(common, dat$results[[j]]$taxon$preferred_common_name)}
}
}
}
dat2 <- dat
dat2 <- data.frame(iconic_name,name,common)
dat2 %>%
group_by(common, iconic_name) %>%
summarise(n = n()) -> data
names(data) <- c("group", "iconic", "value")
packing <- circleProgressiveLayout(data$value, sizetype='area')
data <- cbind(data, packing)
dat.gg <- circleLayoutVertices(packing, npoints=50)
dat.gg$group <- rep(data$iconic, each = 51)
# Make the plot
ggplot() +
# Make the bubbles
geom_polygon(data = dat.gg, aes(x, y, group = id, fill=as.factor(group)), colour = "black", alpha = 0.6) +
# Add text in the center of each bubble + control its size
geom_text(data = data, aes(x, y, size=value, label = group)) +
scale_size_continuous(range = c(1,10), guide = F) +
# General theme:
theme_void() +
theme() +
coord_equal() +
ggtitle(paste("Introduced Species of", place_name)) +
scale_fill_brewer(palette="Set3", direction=-1) +
theme(plot.title = element_text(size = 40, face = "bold")) +
labs(fill = "Iconic Taxon") +
theme(legend.text=element_text(size=20), legend.title = element_text(size=40))+
theme(plot.title = element_text(hjust = 0.5))
ggsave(paste("introduced_species_of_", gsub(" ", "_", place_name), ".png", sep = ""), height = 25, width = 25)