问题描述
我希望有人可以帮助我格式化 phylo.to.plot()
或建议另一种可以产生类似输出的方法。
简而言之,这些是我的问题。我将在下面进一步展开。
可重现的示例:
myTree <- ape::read.tree(text='((A,B),((C,D),(E,F)));')
plot(myTree)
# It needs to be rooted for `phylo.to.map()` to work
myTree$branch.length = NULL
rooted_cladogram = ape::compute.brlen(myTree)
# Sample information
Sample <- c("A","B","C","D","E","F")
coords <- matrix(c(56.001966,57.069417,50.70228,51.836213,54.678997,54.67831,-5.636926,-2.47805,-3.8975018,-2.235444,-3.4392211,-1.751833),nrow=6,ncol=2)
rownames(coords) <- Sample
head(coords)
## Plot phylo.to.map
obj<-phylo.to.map(rooted_cladogram,coords,database="worldHires",regions="UK",plot=FALSE,xlim=c(-11,3),ylim=c(49,59),direction="rightwards")
plot(obj,direction="rightwards",fsize=0.5,cex.points=c(0,1),lwd=c(3,ftype="i")
在此处绘制输出:
问题 1:如何绘制“WorldHires”地图的一个子区域,而不是整个区域?
我希望只有英国大陆,它是 WorldHires 数据库中“英国”的一个子区域。要正常访问它,我会这样做:
map1 <- ggplot2::map_data(map = "worldHires",region = c("UK"),59))
GB <- subset(map1,subregion=="Great Britain")
# Plot
GB_plot<- ggplot(GB )+
geom_polygon(aes(x = long,y = lat,group = group),fill = "white",colour = "black")+
theme_classic()+
theme(axis.line=element_blank(),axis.text=element_blank(),axis.ticks=element_blank(),axis.title=element_blank(),panel.border = element_blank())
我试过了,但它忽略了 subregion 参数。
obj<-phylo.to.map(ttree,subregion="Great Britain",direction="rightwards")
有没有办法直接为它提供地图而不是使用 WorldHires?
问题 2:如何改变地图上点的形状但保持颜色不变?
我想使用地图上的形状在地理上指示我树上的 3 个主要进化枝。但是,当我在其中添加 pch 参数时,它会正确更改形状,但点然后变为黑色,而不是遵循它们之前的颜色。从树到地图的线条保持颜色,只是点本身似乎变黑了。
这是我尝试改变点形状的方式:
# Original code - points
cols <-setNames(colorRampPalette(RColorBrewer::brewer.pal(n=6,name="Dark2"))(Ntip(myTree)),myTree$tip.label)
obj<-phylo.to.map(rooted_cladogram,colors=cols,ftype="i")
点和线是彩色的。我想改变点的形状
# Code to change points = but points are no longer coloured
shapes <- c(rep(2,2),rep(1,rep(0,2))
obj<-phylo.to.map(rooted_cladogram,pch=shapes,ftype="i")
输出:形状已更改,但不再着色:
问题 3:如何向地图添加渐变?
鉴于此 fake dataset,如何创建值变量的平滑梯度?
对此的任何帮助和建议将不胜感激。 知道如何改变点的大小也很有用
在此先非常感谢您, 夏娃
解决方法
我通过使用您在问题中制作的地图改进了我的评论(在某种程度上)。代码如下:
library(mapdata)
library(phytools)
library(ggplot2)
myTree <- ape::read.tree(text='((A,B),((C,D),(E,F)));')
plot(myTree)
# It needs to be rooted for `phylo.to.map()` to work
myTree$branch.length = NULL
rooted_cladogram = ape::compute.brlen(myTree)
# Sample information
Sample <- c("A","B","C","D","E","F")
coords <- matrix(
c(56.001966,57.069417,50.70228,51.836213,54.678997,54.67831,-5.636926,-2.47805,-3.8975018,-2.235444,-3.4392211,-1.751833),nrow=6,ncol=2)
rownames(coords) <- Sample
head(coords)
obj <- phylo.to.map(
rooted_cladogram,coords,database="worldHires",regions="UK",plot=FALSE,xlim=c(-11,3),ylim=c(49,59),direction="rightwards")
# Disable default map
obj2 <- obj
obj2$map$x <- obj$map$x[1]
obj2$map$y <- obj$map$y[1]
# Set plot parameters
cols <- setNames(
colorRampPalette(
RColorBrewer::brewer.pal(n=6,name="Dark2"))(Ntip(myTree)),myTree$tip.label)
shapes <- c(rep(2,2),rep(1,rep(0,2))
sizes <- c(1,2,3,4,5,6)
# Plot phylomap
plot(
obj2,direction="rightwards",fsize=0.5,cex.points=0,colors=cols,pch=shapes,lwd=c(3,1),ftype="i")
# Plot new map area that only includes GB
uk <- map_data(
map = "worldHires",region = "UK")
gb <- uk[uk$subregion == "Great Britain",]
points(x = gb$long,y = gb$lat,cex = 0.001)
# Plot points on map
points(
x = coords[,2],y = coords[,1],pch = shapes,col = cols,cex = sizes)
e:使用 sf 对象而不是点来说明 GB。很难提供更多关于如何为空间变化变量添加符号系统的建议,但是 sf 很受欢迎并且有很好的文档记录,例如https://r-spatial.github.io/sf/articles/sf5.html。如果您有任何其他问题,请告诉我!
ee:添加线条来绘制提示上的名称和符号。
eee:向地图添加了梯度数据集。
library(phytools)
library(mapdata)
library(ggplot2)
library(sf)
myTree <- ape::read.tree(text='((A,"F")
coords <- matrix(c(56.001966,ncol=2)
rownames(coords) <- Sample
head(coords)
obj <- phylo.to.map(
rooted_cladogram,direction="rightwards")
# Disable default map
obj2 <- obj
obj2$map$x <- obj$map$x[1]
obj2$map$y <- obj$map$y[1]
## Plot tree portion of map
# Set plot parameters
cols <- setNames(
colorRampPalette(
RColorBrewer::brewer.pal(n=6,ftype="i")
tiplabels(pch=shapes,col=cols,cex=0.7,offset = 0.2)
tiplabels(text=myTree$tip.label,bg = NA,frame = NA,offset = 0.2)
## Plot GB portion of map
# Plot new map area that only includes GB
uk <- map_data(map = "worldHires",]
# Convert GB to sf object
gb_sf <- st_as_sf(gb,coords = c("long","lat"))
# Covert to polygon
gb_poly <- st_sf(
aggregate(
x = gb_sf$geometry,by = list(gb_sf$region),FUN = function(x){st_cast(st_combine(x),"POLYGON")}))
# Add polygon to map
plot(gb_poly,col = NA,add = TRUE)
## Load and format gradient data as sf object
# Load data
g <- read.csv("gradient_data.txt",sep = " ",na.strings = c("NA"," "))
# Check for,then remove NAs
table(is.na(g))
g2 <- g[!is.na(g$Lng),]
# For demonstration purposes,make dataset easier to manage
# Delete this sampling line to use the full dataset
g2 <- g2[sample(1:nrow(g2),size = 1000),]
# Create sf point object
gpt <- st_as_sf(g2,coords = c("Lng","Lat"))
## Set symbology and plot
# Cut data into 5 groups based on "value"
groups <- cut(gpt$value,breaks = seq(min(gpt$value),max(gpt$value),len = 5),include.lowest = TRUE)
# Set colors
gpt$colors <- colorRampPalette(c("yellow","red"))(5)[groups]
# Plot
plot(gpt$geometry,pch = 16,col = gpt$colors,add = TRUE)
## Optional legend for gradient data
# Order labels and colors for the legend
lev <- levels(groups)
# Used rev() here to make colors in correct order
fil <- rev(levels(as.factor(gpt$colors)))
legend("topright",legend = lev,fill = fil,add = TRUE)
## Plot sample points on GB
# Plot points on map
points(
x = coords[,cex = sizes)
有关渐变符号系统和图例的更多信息,请参见此处:R: Gradient plot on a shapefile