在每个角落放置ggplot文本

时间:2015-08-20 16:13:26

标签: r ggplot2

我有一个带有水平线和垂直线的散点图,它描绘了阈值,因此它们将图分成四个象限。我想标记象限。我认为最好的方法是在图表的四个角落中的每个角落都有一个数字(欢迎提供其他建议!)。

我设法将文字放入每个象限的角落,但这些位置并不完美。我认为问题与轴的缩放不同(值的范围大致相同,但我的图的宽度大约是高度的三倍)这一事实有关。

目前我按以下方式进行。首先,我用点和两条线创建图形,然后我构建它以获得两个轴的范围,我使用它来调整文本的位置。

plot.build = ggplot_build(plot)

xpos = numeric(4)
xpos[2] = xpos[3] = plot.build$panel$ranges[[1]]$x.range[1]
xpos[1] = xpos[4] = plot.build$panel$ranges[[1]]$x.range[2]

ypos = numeric(4)
ypos[1] = ypos[2] = plot.build$panel$ranges[[1]]$y.range[2]
ypos[3] = ypos[4] = plot.build$panel$ranges[[1]]$y.range[1]


plot = plot + geom_text(aes(x2,y2,label = texthere), 
                    data.frame(x2=xpos, y2=ypos, texthere=c("1", "2", "3", "4")),
                    color="#4daf4a", size=4)

基本上这是有效的,但由于缩放,两个轴的数字和边框之间的空间不同。我试图调整文本的x位置,但是ggplot只是扩展了值的范围,位置(相对于边框)保持不变。有没有办法在不改变值范围的情况下移动文本?

提前致谢!

3 个答案:

答案 0 :(得分:25)

此示例使用Inf& -Inf值将文本放置在角落,然后将hjustvjust参数放置在geom_text中,以便将文本放置在图中。使用hjustvarvjustvar将它们放置在图表的内部或外部。

正如@baptiste所提到的,最好为注释使用新的数据集

df <- data.frame(x2=rnorm(100),y2=rnorm(100));library(ggplot2)

annotations <- data.frame(
        xpos = c(-Inf,-Inf,Inf,Inf),
        ypos =  c(-Inf, Inf,-Inf,Inf),
        annotateText = c("Bottom Left (h0,v0)","Top Left (h0,v1)"
                        ,"Bottom Right h1,v0","Top Right h1,v1"),
        hjustvar = c(0,0,1,1) ,
        vjustvar = c(0,1,0,1)) #<- adjust


  ggplot(df, aes(x2, y2)) + geom_point()+
            geom_text(data=annotations,aes(x=xpos,y=ypos,hjust=hjustvar,vjust=vjustvar,label=annotateText))

Example of Text Annotations in Corner

如果我们想要更改任何文字位置,我们会调整hjustvar的水平位置和vjustvar的垂直位置。

# How To Adjust positions (away from corners)
annotations$hjustvar<-c(0,  -1.5,  1,  2.5)  # higher values = right, lower values = left 
annotations$vjustvar<-c(0,1,0,1) # higher values = up, lower values = down 

ggplot(df, aes(x2, y2)) + geom_point()+
        geom_text(data = annotations, aes(x=xpos,y=ypos,hjust=hjustvar,
                                          vjust=vjustvar,label=annotateText))

Height Adjustment away from Corners

希望这有效!

答案 1 :(得分:9)

添加注释时,请确保提供新数据集或使用注释,否则将叠加多个标签,从而产生锯齿状外观。这是另一个答案的最小变化,

df <- data.frame(x2=rnorm(100),y2=rnorm(100))
library(ggplot2)

annotations <- data.frame(
   xpos = c(-Inf,-Inf,Inf,Inf),
   ypos =  c(-Inf, Inf,-Inf,Inf),
   annotateText = c("Text","tExt","teXt","texT"),
   hjustvar = c(0,0,1,1) ,
   vjustvar = c(0,1.0,0,1))


  ggplot(df, aes(x2, y2)) + geom_point()+
  geom_text(data = annotations, aes(x=xpos,y=ypos,hjust=hjustvar,
                vjust=vjustvar,label=annotateText))

enter image description here

答案 2 :(得分:3)

只是想我会扩展给出的答案并产生一些看起来更美观的东西。起初,使用 hjust 和 vjust 时文本移动的方向可能看起来有点违反直觉(至少对我而言),因此我对每一行进行了注释以帮助其他人理解。

library(tidyverse)

##Example 1
annotations1 <- data.frame(
  xpos = c(-Inf, -Inf, Inf, Inf), ypos =  c(-Inf, Inf, -Inf, Inf), #left-bottom, left-top, right-bottom, right-top
  annotateText = c("Text", "tExt", "teXt", "texT"),
  # hjustvar = c(0,0,1,1), vjustvar = c(0,1,0,1))   #original placement in each corner
  hjustvar = c(-.5,   #shifts bottom left 'Text' to the right; make more negative to move it further right
               -.5,   #shifts top right 'tExt' to the right; make more negative to move it further right
               1.5,   #shifts bottom right 'teXt' to the left; make more positive to move it further left
               1.5),  #shifts top right 'texT' to the left; make more positive to move it further left
  vjustvar = c(-1,    #shifts bottom left 'Text' upward; make more negative to move it further up
               2,     #shifts top right 'tExt' downward; make more positive to move it further down
               -1,    #shifts bottom right 'teXt' upward; make more negative to move it further up
               2)     #shifts top right 'texT' downward; make more positive to move it further down
)

df1 <- data.frame(x1 = sample(c(-5:5), size = 100, replace = TRUE), y1 = sample(c(-5:5), size = 100, replace = TRUE))

ggplot(df1, aes(x1, y1)) + geom_point() +
  xlim(-6, 6) + ylim(-6, 6) + 
  geom_text(data = annotations1, aes(x = xpos, y = ypos, hjust = hjustvar, vjust = vjustvar, label = annotateText))

text moved slightly away from corners

调整 hjustvar 和 vjustvar 值会使文本框越来越向内部移动,无论轴的比例如何。

##Example 2
annotations2 <- data.frame(
  xpos = c(-Inf, -Inf, Inf, Inf), ypos =  c(-Inf, Inf, -Inf, Inf),
  annotateText = c("Text", "tExt", "teXt", "texT"),
  hjustvar = c(-2, -2, 3, 3),
  vjustvar = c(-4, 5, -4, 5))

df2 <- data.frame(x2 = rnorm(100), y2 = rnorm(100))

ggplot(df2, aes(x2, y2)) + geom_point() +
  geom_text(data = annotations2, aes(x = xpos, y = ypos, hjust = hjustvar, vjust = vjustvar, label = annotateText))

text moved further inward, axis limits not set