【问题标题】:ggplot2 boxplot with labelled rug带有标签地毯的ggplot2箱线图
【发布时间】:2012-11-23 13:23:30
【问题描述】:

我可以用 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)

基本上我正在寻找一种方法如何在箱线图下方绘制带标签的地毯。

有什么提示或建议吗?

【问题讨论】:

  • 我认为将需要一些特定的网格布局,以便将文本放置在绘图区域之外,并将线段与地毯的标签连接起来。如果您确实想到了什么或得到回复,我会对它们感兴趣,因为我刚刚采取了第一个尝试性步骤,沿着包 ggvegan 的路径,希望(最终)提供 ggplot vegan 中所有绘图函数的 版本。
  • @Gavin Simpson:好主意!我还用 ggplot2 绘制了一些命令。 github上也有phyloseq。你的项目在 github 上吗(用于协作)?
  • 还没有,但很快就会。我要在 github 上弹出这个并同步到 r-forge。我们将不胜感激地收到任何和所有的贡献。那些试探性的步骤主要是在我的脑海中,一些探索性代码正在调查autoplot()。还需要一些头脑风暴——只是制作情节或返回一个有用的对象?等等。

标签: r ggplot2 vegan


【解决方案1】:

这是仅使用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 好东西。我要偷这个用于我正在编写的 ggvegan 包中。
【解决方案2】:

我已经开始研究解决方案,但我有点卡住了。我发布它是希望一些铁杆数据可视化的人可以为真正的解决方案做出贡献(如果这不是这样做的方法,请告诉我,我将删除这个半生不熟的项目)。

# 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

【讨论】:

  • 我相信 this post 可以帮助我们解决这个问题。
  • 以您的解决方案为起点,添加了我对这个情节的想法。
猜你喜欢
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 2017-06-29
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
相关资源
最近更新 更多