R可视化ggplot中的cca图 - 错误的箭头长度
R Visualize cca plot in ggplot - Wrong arrows length
我正在尝试自定义在 Vegan R 包中执行的 CCA 图。我使用底栖覆盖矩阵 (%) 与鱼类丰度矩阵(个体数量)来 运行 此分析。我在 2 年内收集了 4 个珊瑚礁的数据。我想让这些地点有不同颜色的点(对于珊瑚礁地点)和形状(年份),鱼类作为文本,底栖动物作为箭头。我几乎已经在 ggplot 中手动完成了,但是箭头长度似乎是错误的。将我的图与 "autoplot" 和 "plot.cca" 生成的图进行比较,我的箭头看起来太短了。我的问题是如何解决这个问题?
请从这个 link 复制 "benthos" 和 "fish" 数据帧:http://pedromeirelles.com.br/blog)。数字(ggvegan、cca.plot 和 ggplot)也可以在这个 link 中找到。我还不能在这里发布图像,而且数据框太大了。对于给您带来的不便,我们深表歉意。
非常感谢您。
下面是我用来绘制地块的脚本。
ggplot 手动绘制
library("ggplot2")
library("vegan")
library("grid")
library("ggvegan")
benthos <- please copy this dataframe from the link above
fish <- please copy this dataframe from the link above
attach(fish)
fish.num<-fish[,3:ncol(fish)]
benthos.num <-benthos[,3:ncol(benthos)]
mod <- cca(fish.num, benthos.num)
cca.res<-summary(mod)
cca.sites <-data.frame(cca.res$sites)
ord_df<-data.frame(Site=Site,Year=Year,CCA1=cca.sites$CCA1,CCA2=cca.sites$CCA2)
ord_df$Year <- factor(ord_df$Year)
ord_df$Site <- factor(ord_df$Site)
exp<-cca.res$concont
exp<-data.frame(exp$importance)
cca.species<-data.frame(cca.res$species)
cca.species<-data.frame(Cca1=cca.species$CCA1,Cca2=cca.species$CCA2,species=rownames(cca.species))
cca.benthos<-data.frame(cca.res$biplot)
cca.benthos<-data.frame(cca1=cca.benthos$CCA1,cca2=cca.benthos$CCA2, Species = rownames(cca.benthos))
ggplot(ord_df) +
geom_point(mapping = aes(x=CCA1, y=CCA2, color=Site, shape=Year),size = 4)+
geom_text(data = cca.species,
aes(x = Cca1, y = Cca2, label = species),
size = 3,alpha=0.4,colour = "darkred") +
geom_segment(data = cca.benthos,
aes(x = 0, xend = cca1, y = 0, yend = cca2),
arrow = arrow(length = unit(0.5, "cm")), size=1, colour = "grey") +
geom_text(data = cca.benthos,
aes(x = cca1*1.5, y = cca2*1.5, label = Species),
size = 5) +
labs(list(title = NULL, x = paste("CCA1 (",round(exp[2,1]*100,digits=2),"%)"), y = paste("CCA2 (",round(exp[2,2]*100,digits=2),"%)"))) +
geom_hline(yintercept = 0, colour = "gray70") +
geom_vline(xintercept = 0, colour = "gray70") +
scale_colour_manual(values=c("#43CD80","#9400D3","steelblue3","#DEB887"))+
theme_bw()+
theme(panel.border = element_rect(colour = "white", size=1))+
theme(legend.key=element_rect(fill='white'))+
theme(legend.key = element_rect(colour = "white"))+
theme(axis.title.x = element_text(face="bold", size=14))+
theme(axis.title.y = element_text(face="bold", size=14))+
theme(axis.text.x = element_text(size=14,color="black"))+
theme(axis.text.y = element_text(size=14,color="black"))+
theme(axis.line.x=element_blank())+
theme(axis.line.y=element_blank())+
theme(
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.major.y = element_blank(),
panel.grid.minor.y = element_blank())
ggvegen 自动绘图
autoplot(mod)
plot.cca
plot(mod, type="n")
text(mod, dis="bp")
points(mod, display="sites",pch=21, col="red", bg="yellow", cex=1.2)
text(mod, "species", col="blue", cex=0.8)
text(mod, display = "sites", cex=0.7, col="red")
我找不到数据图输入的差异
fdat <- fortify(mod)
fdat
cca.benthos
vegan::scores(mod, display = "bp")
您错过了 plot.cca()
和 autoplot.cca()
缩放箭头以适应绘图 window 的步骤。这是在 plot.cca()
中完成的,并且是在 ggvegan 0.0-3 之前的 autoplot.cca()
中通过效用函数 ordiArrowMul()
.
完成的
从 vegan 版本 2.3-0 开始,此函数从 vegan 导出。但它使用来自基础图形的信息来进行缩放。因此,从 ggvegan 的 0.0-3 版本开始,有一个 non-exported function ggvegan:::arrowMul()
将完成与 ordiArrowMul()
相同的工作,但来自数据而不是当前的地块限制。 (在这个函数的未来版本中,我计划允许您在基本图中更改 xlim
和 ylim
时设置绘图的限制。)
你应该可以做到
mul <- ggvegan:::arrowMul(cca.res$biplot,
rbind(cca.sites, cca.species))
cca.benthos <- data.frame(cca.res$biplot * mul)
(未经测试,我即将出发 - post 如果无法正常工作,请发表评论,稍后我会详细介绍。)
我正在尝试自定义在 Vegan R 包中执行的 CCA 图。我使用底栖覆盖矩阵 (%) 与鱼类丰度矩阵(个体数量)来 运行 此分析。我在 2 年内收集了 4 个珊瑚礁的数据。我想让这些地点有不同颜色的点(对于珊瑚礁地点)和形状(年份),鱼类作为文本,底栖动物作为箭头。我几乎已经在 ggplot 中手动完成了,但是箭头长度似乎是错误的。将我的图与 "autoplot" 和 "plot.cca" 生成的图进行比较,我的箭头看起来太短了。我的问题是如何解决这个问题?
请从这个 link 复制 "benthos" 和 "fish" 数据帧:http://pedromeirelles.com.br/blog)。数字(ggvegan、cca.plot 和 ggplot)也可以在这个 link 中找到。我还不能在这里发布图像,而且数据框太大了。对于给您带来的不便,我们深表歉意。
非常感谢您。
下面是我用来绘制地块的脚本。
ggplot 手动绘制
library("ggplot2")
library("vegan")
library("grid")
library("ggvegan")
benthos <- please copy this dataframe from the link above
fish <- please copy this dataframe from the link above
attach(fish)
fish.num<-fish[,3:ncol(fish)]
benthos.num <-benthos[,3:ncol(benthos)]
mod <- cca(fish.num, benthos.num)
cca.res<-summary(mod)
cca.sites <-data.frame(cca.res$sites)
ord_df<-data.frame(Site=Site,Year=Year,CCA1=cca.sites$CCA1,CCA2=cca.sites$CCA2)
ord_df$Year <- factor(ord_df$Year)
ord_df$Site <- factor(ord_df$Site)
exp<-cca.res$concont
exp<-data.frame(exp$importance)
cca.species<-data.frame(cca.res$species)
cca.species<-data.frame(Cca1=cca.species$CCA1,Cca2=cca.species$CCA2,species=rownames(cca.species))
cca.benthos<-data.frame(cca.res$biplot)
cca.benthos<-data.frame(cca1=cca.benthos$CCA1,cca2=cca.benthos$CCA2, Species = rownames(cca.benthos))
ggplot(ord_df) +
geom_point(mapping = aes(x=CCA1, y=CCA2, color=Site, shape=Year),size = 4)+
geom_text(data = cca.species,
aes(x = Cca1, y = Cca2, label = species),
size = 3,alpha=0.4,colour = "darkred") +
geom_segment(data = cca.benthos,
aes(x = 0, xend = cca1, y = 0, yend = cca2),
arrow = arrow(length = unit(0.5, "cm")), size=1, colour = "grey") +
geom_text(data = cca.benthos,
aes(x = cca1*1.5, y = cca2*1.5, label = Species),
size = 5) +
labs(list(title = NULL, x = paste("CCA1 (",round(exp[2,1]*100,digits=2),"%)"), y = paste("CCA2 (",round(exp[2,2]*100,digits=2),"%)"))) +
geom_hline(yintercept = 0, colour = "gray70") +
geom_vline(xintercept = 0, colour = "gray70") +
scale_colour_manual(values=c("#43CD80","#9400D3","steelblue3","#DEB887"))+
theme_bw()+
theme(panel.border = element_rect(colour = "white", size=1))+
theme(legend.key=element_rect(fill='white'))+
theme(legend.key = element_rect(colour = "white"))+
theme(axis.title.x = element_text(face="bold", size=14))+
theme(axis.title.y = element_text(face="bold", size=14))+
theme(axis.text.x = element_text(size=14,color="black"))+
theme(axis.text.y = element_text(size=14,color="black"))+
theme(axis.line.x=element_blank())+
theme(axis.line.y=element_blank())+
theme(
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.major.y = element_blank(),
panel.grid.minor.y = element_blank())
ggvegen 自动绘图
autoplot(mod)
plot.cca
plot(mod, type="n")
text(mod, dis="bp")
points(mod, display="sites",pch=21, col="red", bg="yellow", cex=1.2)
text(mod, "species", col="blue", cex=0.8)
text(mod, display = "sites", cex=0.7, col="red")
我找不到数据图输入的差异
fdat <- fortify(mod)
fdat
cca.benthos
vegan::scores(mod, display = "bp")
您错过了 plot.cca()
和 autoplot.cca()
缩放箭头以适应绘图 window 的步骤。这是在 plot.cca()
中完成的,并且是在 ggvegan 0.0-3 之前的 autoplot.cca()
中通过效用函数 ordiArrowMul()
.
从 vegan 版本 2.3-0 开始,此函数从 vegan 导出。但它使用来自基础图形的信息来进行缩放。因此,从 ggvegan 的 0.0-3 版本开始,有一个 non-exported function ggvegan:::arrowMul()
将完成与 ordiArrowMul()
相同的工作,但来自数据而不是当前的地块限制。 (在这个函数的未来版本中,我计划允许您在基本图中更改 xlim
和 ylim
时设置绘图的限制。)
你应该可以做到
mul <- ggvegan:::arrowMul(cca.res$biplot,
rbind(cca.sites, cca.species))
cca.benthos <- data.frame(cca.res$biplot * mul)
(未经测试,我即将出发 - post 如果无法正常工作,请发表评论,稍后我会详细介绍。)