在R中的绘图之外绘制文本块

时间:2016-10-26 20:19:57

标签: r text plot alignment

我想在一个情节旁边放一个较长的文字,但我的格式有问题。这是实际情节的代码:

percentile.plot <- function(value = 3, rev = FALSE,
                        col.fade = c("snow2","snow1", "snow"),
                        box.lwd = 3, box.col="snow4", point.col= "black"){
 x <-c(1:5)
 y <- rep(1, 5)
 colfunc <- colorRampPalette(col.fade)
 if(rev){colors <- rev(colfunc(2000))} else { colors <- colfunc(2000) }
 segm <- seq(0, 5, by = 0.005)

par(mar = c(0, 10, 0, 10))
plot(x, y, type = "n", bty="n", axes=F, ylab="", xlab="", 
   xlim=c(0,5), ylim=c(0,1), asp=1,
   xaxs ="i", yaxs = "i")
 segments(x0 = segm, y0 = 0, y1=1, x1 = segm, col= colors, lty=1.2)

segments(x0 = c(0:5), y0 = 0, y1=1, x1 = c(0:5), col= box.col, lwd=box.lwd)
segments(x0 = 0, y0 = c(0:1), y1=c(0:1), x1 = 5, col= box.col, lwd=box.lwd)

if (value >= .99) {value <- .99}
if (value < .01) {value <- .01}
value.trans <- value*5
points(x = value.trans, y = 0.5, pch=4, lwd=3, cex=1.3, col=point.col)

}

percentile.plot(0.9)

现在我想将文本块左右放置到图中,看起来像这样:

text_left <- "I would like to put a text next to my graph \n
            but unfortunately I cannot get the formatting \n
            right. Either my margins are to big to knit my \n
            plot into an html or the text is not aligned \n
            as I want it to be. I am sure there is an easy \n
            solution but I haven’t found one yet." 

text_right <- "I would like to put a text next to my graph \n
            but unfortunately I cannot get the formatting \n
            right. Either my margins are to big to knit my \n
            plot into an html or the text is not aligned \n
            as I want it to be. I am sure there is an easy \n
            solution but I haven’t found one yet." 

我尝试了以下内容:

par(lheight = 0.5)
mtext(text_left, las = 1, side = 2, outer = TRUE, adj = 0, line= 5, cex = .8) 
mtext(text_right, las = 1, side = 4, outer = TRUE, adj = 0, line= -8, cex = .8) 

结果是:

plot

我想要的是图表左侧的文本块,它在图的左侧对齐,另一个在图的右侧对齐,也在左侧对齐。这些文本应该是我计算的图的每一端的描述。

此外,我在不同的计算机(13&#39;&#39;和27&#39;&#39;)上尝试了此操作,并且必须更改边距大小才能获得相同的结果。有没有更好的方法来添加文字到剧情?此外,实际情节应该比图片中的情节大,但我无法做到这一点。

1 个答案:

答案 0 :(得分:1)

使用网格图形可能更容易

percentileGrob <- function(value = 3, ...){
  x <-c(1:5)
  y <- rep(1, 5)
  g1 <- rasterGrob(t(colorRampPalette(blues9)(100)), width=unit(1,"npc"), height=unit(1,"npc"))
  h <- 1/5
  g2 <- rectGrob(x=seq(h/2, 1-h/2, by=h), width=h, gp=gpar(fill=NA))
  g3 <- pointsGrob(seq(h/2, 1-h/2, by=h)[5],0.5, pch=4, gp=gpar(lwd=4))
  grobTree(g1, g2, g3,vp=viewport(width=unit(1,"snpc"), height=unit(1/5,"snpc")))
}

text_left <- "I would like to put a text next to my graph but unfortunately I cannot get the formatting right. Either my margins are to big to knit my plot into an html or the text is not aligned as I want it to be. I am sure there is an easy solution but I haven’t found one yet." 

library(gridExtra)

tl <- textGrob(paste(strwrap(text_left, 50), collapse="\n"), hjust=0, x=0)
tr <- textGrob(paste(strwrap(text_left, 50), collapse="\n"), hjust=0, x=0)
grid.arrange(tl, percentileGrob(), tr, widths=unit.c(grobWidth(tl), unit(1,"npc") - grobWidth(tl) - grobWidth(tr), grobWidth(tr)))

enter image description here