iNaturalist Sankey Diagram

Code to make this figure is below and can be downloaded here: Change the taxon_id and the taxon_name to your species of interest. Find your taxon id from the iNaturalist search function, when you search your species name in the search bar, like “large milkweed bug”, the resulting url has the place name in the url (ex. for the url https://www.inaturalist.org/observations?taxon_id=55556 the taxon id is 55556)

	#install.packages("tidyverse", "devtools", "networkD3")
	#library(devtools)
	#devtools::install_github("hrbrmstr/curlconverter")
	library(curlconverter)
	library(tidyverse)
	library(networkD3)
	taxon_id <- 47219
	taxon_name <- "Apis mellifera"

	####API Call####
	api <- paste("curl -X GET --header 'Accept: application/json' 
	 'http://api.inaturalist.org/v1/identifications/similar_species?    is_change=false&current=true&order=desc&order_by=created_at&taxon_id=", taxon_id, "'", sep="")
	my_ip <- straighten(api) %>% 
	  make_req()

	dat <- content(my_ip[[1]](), as="parsed")
	links <- data.frame(target = rep(NA, dat$total_results), value = rep(NA, dat$total_results))
	for(i in 1:dat$total_results){
	  links$target[i] <- dat$results[[i]]$taxon$name
	  links$value[i] <- dat$results[[i]]$count
	}

	####Formatting####
	links %>% 
	  separate(target, c("genus", "species")) %>% 
	  group_by(genus) %>%
	  summarise(n = n(), value = sum(value)) %>%
	  filter(n > 1) %>% 
	  mutate(target = genus)%>%
	  select(-n, -genus) -> genera
	genera$source <- rep(taxon_name, nrow(genera))
	links$source <- rep(taxon_name, nrow(links))

	links %>% 
	  separate(target, c("genus", "species"), remove = F) -> links
	links$source[links$genus %in% genera$target] <- links$genus[links$genus %in% genera$target]
	links <- select(links, -genus, -species)
	links <- bind_rows(links, genera)

	####SANKEY####
	nodes <- data.frame(
	  name=c(as.character(links$source), 
			 as.character(links$target)) %>% unique()
	)

	# With networkD3, connection must be provided using id, not using real name like in the links dataframe.. So we need to reformat it.
	links$IDsource <- match(links$source, nodes$name)-1 
	links$IDtarget <- match(links$target, nodes$name)-1

	# Add a 'group' column to each node. Here I decide to put all of them in the same group to make them grey
	nodes$group <- as.factor(c("my_unique_group"))

	# Make the Network
	p <- sankeyNetwork(Links = links,
					   Nodes = nodes,
					   Source = "IDsource",
					   Target = "IDtarget",
					   Value = "value",
					   NodeID = "name", 
					   sinksRight=F,
					   fontSize = 20,
					   iterations = 23,
					   nodeWidth = 5)
	ggsave(paste(gsub(" ", "_",taxon_name), "sankey_plot.png"), p, height = 10, width = 10)