格式化系统发育以映射 R 中的投影`phylo.to.plot`,或替代方法

问题描述

我希望有人可以帮助我格式化 phylo.to.plot() 或建议另一种可以产生类似输出方法

我已按照教程 here 生成输出,但似乎很难更改结果数字。

简而言之,这些是我的问题。我将在下面进一步展开。

  1. 如何绘制“WorldHires”地图的一个子区域,而不是整个区域?
  2. 改变地图上点的形状,但保持颜色?
  3. 将连续变量的梯度添加到地图

可重现的示例:

这是一个非常基本的树,其中包含一些随机分配的地理位置

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")

在此处绘制输出

output

问题 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())

看起来像这样:

GB_wordHire_subRegion

我试过了,但它忽略了 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")

点和线是彩色的。我想改变点的形状

Coloured points

# 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")

输出:形状已更改,但不再着色:

shape_butNocolour

问题 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)

phlyo_gb

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

enter image description here

gradient2

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...