我可以用ggplot2制作这样的情节吗?
# data
require(vegan)
data(dune)
data(dune.env)
# RDA
RDA <- rda(dune ~ A1, data = dune.env)
# extract species scores
df <- data.frame(spec_scores = scores(RDA)$species[ , 1],
taxa = rownames(scores(RDA)$species))
df <- df[abs(df$spec_scores) > 0.05, ]
# plot
par(mar = c(5,4,4,8))
# boxplot of sites-scores along A1-axis
boxplot(scores(RDA)$sites[ , 1] ~ dune.env$Management)
abline(h = 0, lty = "dotted")
# add species scores to plot
rug(df$spec_scores, side=4)
linestack(df$spec_scores, labels=df$taxa, at = par("usr")[2], add = TRUE, hoff = 1)
基本上我正在寻找一种如何在箱线图下方绘制带标签的地毯的方法。
任何提示或建议?
答案 0 :(得分:16)
这只是使用ggplot2
的解决方案,所以它不是最优雅的。
我从@Eric Fail建议的第一步开始。
require(vegan)
data(dune)
data(dune.env)
# RDA
RDA <- rda(dune ~ A1, data = dune.env)
# extract species scores
df1 <- data.frame(RDA.scores = scores(RDA)$sites[ , 1], Management = dune.env$Management)
df2 <- data.frame(y = scores(RDA)$species[ , 1], taxa = rownames(scores(RDA)$species))
# Order data according to species scores
df2<-df2[order(df2$y),]
# define values for rugs (segments). 4.9 and 5.0 used because data has 4 levels (+1)
df2$x=4.9
df2$xend=5
# define coordinates for names (30 is number of species)
df2$yend2<-seq(min(df1$RDA.scores),max(df1$RDA.scores),length.out=30)
df2$xend2=5.3
# plot
P <- ggplot(data = df1, aes( x = Management, y = RDA.scores) ) +
geom_segment(y=0,yend=0,x=0,xend=5, lty=2, size = I(0.3)) +
geom_boxplot() +
#add extra levels to get space
scale_x_discrete(limits=c("BF", "HF", "NM", "SF", "","")) +
#set y scale
scale_y_continuous(limits=c(-3,5),expand=c(0,0)) +
#add rugs as segments and add segments connecting rugs and texts
geom_segment(data= df2, mapping=aes(x=x,xend=xend,y=y,yend=y), size = I(0.3)) +
geom_segment(data= df2, mapping=aes(x=xend,xend=xend2,y=y,yend=yend2), size = I(0.4)) +
#add texts
geom_text(data=df2,mapping=aes(x=xend2+0.1,y=yend2,label=taxa),hjust=0, size=3) +
#add rectangular to imitate box around plot
geom_rect(xmax=5,xmin=0.4,ymax=5,ymin=-3,colour="black",fill=NA)
# Final adjustments of plot
P+theme(axis.line=element_blank(),
panel.grid=element_blank(),
panel.background=element_blank())
答案 1 :(得分:4)
我已经开始研究解决方案,但我有点卡住了。我发布它是希望硬核数据可视化人员可以为真正的解决方案做出贡献(如果不是这样做的方式,请告诉我,我将删除这个半生不熟的项目)。
# data
require(vegan)
data(dune)
data(dune.env)
# RDA
RDA <- rda(dune ~ A1, data = dune.env)
# extract species scores
df1 <- data.frame(RDA.scores = scores(RDA)$sites[ , 1], Management = dune.env$Management)
df2 <- data.frame(spec_scores = scores(RDA)$species[ , 1], taxa = rownames(scores(RDA)$species))
df2 <- df2[abs(df2$spec_scores) > 0.05, ]
df2 <- cbind(df2, x = rep(1:4, 6))
# plot
P <- ggplot(data = df1, aes( x = Management, y = RDA.scores) ) + geom_boxplot() + theme_bw() +geom_hline(y=0, lty=2) + geom_rug(data= df2, mapping=aes(x = x , y = spec_scores), sides="r") + geom_text(data= df2, mapping=aes(x=5, y=spec_scores, label=taxa), size=2) + xlim(c("BF", "HF", "NM", "SF", ""))
P