variable script one multiple ggplot example boxplots r ggplot2 vegan

script - ggplot2 boxplot con alfombra etiquetada



script boxplot r (2)

¿Puedo hacer una trama con 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)

Básicamente estoy buscando una manera de trazar una alfombra etiquetada debajo del diagrama de caja.

¿Alguna pista o sugerencia?


Empecé a trabajar en una solución, pero estoy un poco atascado. Lo estoy publicando con la esperanza de que alguien de la gente de visualización de datos hardcore pueda contribuir a una solución real (si esta no es la forma de hacerlo, hágamelo saber y eliminaré este proyecto a medias).

# 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


Esta es una solución que solo usa ggplot2 , por lo que no será la más elegante.

Comencé con los primeros pasos sugeridos por @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())