Code:
library(tidyverse)
library(ggforce)
t=read.csv("https://drive.google.com/uc?export=download&id=1wZr-UOve0KUKo_Qbgeo27m-CQncZWb8y",row.names=1)
xpop="Italian_Calabria"
ypop="Norwegian"
d=as.data.frame(as.matrix(dist(t)))
xy=d[,c(xpop,ypop)]
names(xy)=c("x","y")
lim=.34 # show only populations with G25 distance below limit to x and y populations
pick=rownames(t)[xy$x<lim&xy$y<lim]
xy=xy[pick,]
d=d[pick,pick]
seg=lapply(1:3,function(i)apply(d,1,function(x)unlist(xy[names(sort(x)[i]),],use.names=F))%>%t%>%cbind(xy))%>%do.call(rbind,.)%>%setNames(paste0("V",1:4))
expand=.015
lims=c(-expand,max(apply(xy,2,range))+expand)
xy$k=as.factor(cutree(hclust(as.dist(d)),24))
# xy$k=as.factor(kmeans(as.dist(t),16)$cluster) # use K-means instead of hierarchical clustering
brk=.02
lab=sub("^0","",sprintf("%.3f",seq(0,1,brk)))
lab[1]="0"
ggplot(xy,aes(x,y))+
geom_abline(linetype="dashed",color="gray80",size=.3)+
geom_segment(data=seg,aes(x=V1,y=V2,xend=V3,yend=V4),color="gray50",size=.1)+
ggforce::geom_mark_hull(aes(color=k,fill=k),concavity=1000,radius=unit(.15,"cm"),expand=unit(.15,"cm"),alpha=.2,size=.15)+
# geom_polygon(data=xy%>%group_by(k)%>%slice(chull(x,y)),alpha=.2,aes(color=k,fill=k),size=.3)+ # draw convex hulls without rounded corners
geom_point(aes(color=k),size=.5)+
geom_text(aes(color=k),label=rownames(xy),size=2,vjust=-.7)+
# ggrepel::geom_text_repel(aes(color=k),label=rownames(xy),size=2,max.overlaps=Inf,force=2,segment.size=.2,min.segment.length=.2,box.padding=.05)+ # avoid overlapping text labels
coord_cartesian(xlim=lims,ylim=lims,expand=F)+
scale_x_continuous(breaks=seq(0,1,brk),labels=lab)+
scale_y_continuous(breaks=seq(0,1,brk),labels=lab)+
labs(x=paste("G25 distance to",xpop),y=paste("G25 distance to",ypop))+
theme(
axis.text=element_text(size=6),
axis.text.y=element_text(angle=90,vjust=1,hjust=.5),
axis.ticks=element_blank(),
axis.ticks.length=unit(0,"cm"),
axis.title=element_text(size=8),
legend.position="none",
panel.background=element_rect(fill="white"),
panel.border=element_rect(color="gray80",fill=NA,size=.6),
panel.grid.major=element_line(color="gray92",size=.2),
plot.background=element_rect(fill="white")
)
ggsave("a.png",width=8,height=8)
Bookmarks