I wanted to make a map of the locations in the world were some bacterial isolates were collected. I found a nice website that gave me some useful location on plotting maps in R.
Here's what I found worked for me.
First I got a map of the world:
> library("ggplot2")
> theme_set(theme_bw())
> library("sf")
> library("rnaturalearth")
> library("rnaturalearthdata")
> world <- ne_countries(scale = "medium", returnclass = "sf")
Then I made a text file in which I had the number of bacterial isolates collected in each country, and the abbreviation for countries using the ISO_A3 three-letter codes:
Isolates Country "Country Code"
1 Bahrain BHR
1 Ecuador ECU
1 El Salvador SLV
1 Gabon GAB
1 Guatemala GTM
1 Bahrain BHR
1 Ecuador ECU
1 El Salvador SLV
1 Gabon GAB
1 Guatemala GTM
...
I read in this file:
MyCountryCountData <- read.table("countrycount_data.txt",header=TRUE, sep="\t", stringsAsFactors=FALSE)
Then I stored the data on the number of counts from each country, from this file:
numcountries <- length(world$iso_a3)
isolatecounts <- numeric()
for (i in 1:numcountries)
{
mycountry <- world$iso_a3[i]
print(paste("Calculating for country=",mycountry," row i=",i, "mylength=",length(isolatecounts)))
myindex <- which(mycountry == MyCountryCountData$Country.Code)
if (length(myindex) > 0)
{
myisolates <- MyCountryCountData$Isolates[myindex]
isolatecounts <- append(isolatecounts, myisolates, after=length(isolatecounts))
}
else
{
isolatecounts <- append(isolatecounts, 0, after=length(isolatecounts))
}
}
isolatecounts <- numeric()
for (i in 1:numcountries)
{
mycountry <- world$iso_a3[i]
print(paste("Calculating for country=",mycountry," row i=",i, "mylength=",length(isolatecounts)))
myindex <- which(mycountry == MyCountryCountData$Country.Code)
if (length(myindex) > 0)
{
myisolates <- MyCountryCountData$Isolates[myindex]
isolatecounts <- append(isolatecounts, myisolates, after=length(isolatecounts))
}
else
{
isolatecounts <- append(isolatecounts, 0, after=length(isolatecounts))
}
}
Then I made a plot showing a map of the world, with the countries coloured in according to their number of isolates:
Make a 300 dpi tiff file:
> tiff("countries_histogram.tiff", units="in", width=5, height=5, res=300)
> ggplot(data = world) + geom_sf(aes(fill = isolatecounts[1:242])) + scale_fill_viridis_c(option = "plasma", trans="sqrt")
> dev.off()
> tiff("countries_histogram.tiff", units="in", width=5, height=5, res=300)
> ggplot(data = world) + geom_sf(aes(fill = isolatecounts[1:242])) + scale_fill_viridis_c(option = "plasma", trans="sqrt")
> dev.off()
The plot looks something like this:

No comments:
Post a Comment