ggplot2通过常规的“顶部”,“底部”,“左侧”,“右侧”,“中心”指定geom_text位置

CCu*_*tis 1 r ggplot2 geom-text

我正在ggplot中制作一些图形,并且在不指定x和y位置的情况下无法弄清楚如何在图形文本中进行绘制。

比方说,我在做这样的曲线图。

sp <- ggplot(mpg, aes(hwy, cty, label = "sometext"))+
    geom_point()
Run Code Online (Sandbox Code Playgroud)

我想在每个图形中添加以相同方式打印的标签。调用以下命令仅在提供给的每个x,y值处打印文本aes

sp + geom_text()
Run Code Online (Sandbox Code Playgroud)

我可以操纵提供的xy数据geom_text()以确保文本在图形之间保持相同的相对位置,但是有没有一种简单的方法可以通过默认位置(例如“顶部”,“底部”等)来调用位置?即sp + geom_text(position="top")

hrb*_*str 9

我避免annotate像瘟疫一样,只使用一个空的数据框data参数geom_text

ggplot(mpg, aes(hwy, cty, label = "sometext"))+
  geom_point() +
  geom_text(data=data.frame(), aes(label = 'sometext', x = -Inf, y = Inf),
            hjust = 0, vjust = 1)
Run Code Online (Sandbox Code Playgroud)

  • 它专注于文本元素;用网格操作(特别是针对它们)对它们进行后期绘制会更容易——但是,请记住,我在业余时间在幕后用 ggplot2 做了很多工作,所以并不是每个人都这样做;从长远来看,我通常最终不得不在各个方面进行不同的注释,我可以只添加与删除,而不会忘记我使用了注释。只是个人偏好。 (2认同)

bap*_*ste 8

编写包装器当然是可能的,但是定义单位和理由的方式使它变得相当冗长,

library(ggplot2)

qplot(1,1) + 
  annotation_compass('testN') + 
  annotation_compass('testE','E') + 
  annotation_compass('testSW','SW') + 
  annotation_compass('testW','W')
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

annotation_compass <- function(label,
                               position = c('N','NE','E','SE','S','SW','W','NW'),
                               padding = grid::unit(c(0.5,0.5),"line"), ...){
  position <- match.arg(position)
  x <- switch (position,
    N = 0.5,
    NE = 1,
    E = 1,
    SE = 1,
    S = 0.5, 
    SW = 0,
    W = 0, 
    NW = 0
  )
  y <- switch (position,
               N = 1,
               NE = 1,
               E = 0.5,
               SE = 0,
               S = 0, 
               SW = 0,
               W = 0.5, 
               NW = 1
  )
  hjust <- switch (position,
               N = 0.5,
               NE = 1,
               E = 1,
               SE = 1,
               S = 0.5, 
               SW = 0,
               W = 0, 
               NW = 0
  )
  vjust <- switch (position,
               N = 1,
               NE = 1,
               E = 0.5,
               SE = 0,
               S = 0, 
               SW = 0,
               W = 0.5, 
               NW = 1
  )
  f1 <- switch (position,
                   N = 0,
                   NE = -1,
                   E = -1,
                   SE = -1,
                   S = 0, 
                   SW = 1,
                   W = 1, 
                   NW = 1
  )
  f2 <- switch (position,
                   N = -1,
                   NE = -1,
                   E = 0,
                   SE = 1,
                   S = 1, 
                   SW = 1,
                   W = 0, 
                   NW = -1
  )
  annotation_custom(grid::textGrob(label, 
                                   x=grid::unit(x,"npc") + f1*padding[1] , 
                                   y=grid::unit(y,"npc") + f2*padding[2],
                                   hjust=hjust,vjust=vjust, ...))
}
Run Code Online (Sandbox Code Playgroud)


Jan*_*yer 7

使用无穷大的解决方案很好,绝对是最简单的选择。

但是,如果你想在你的标签的位置,更多的控制(例如,如果你想让他们为中心,或者如果你想轴心线和注释之间更多的空间),你可以使用一些数学与min()max()你的情节标题创建将标题置于顶部、底部、右侧或左侧。下面的代码有点冗长,但如果图中的值发生变化,仍会正确放置标签。此外,要复制到其他图,您无需手动计算值,只需更改 x 和 y 变量的名称。

sp <- ggplot(mpg, aes(hwy, cty)) +
  geom_point() +
  theme_classic() +
  annotate("text", label = "top", 
           x = 0.5*(min(mpg$hwy) + max(mpg$hwy)), y = max(mpg$cty), vjust = 1) +
  annotate("text", label = "bottom", 
           x = 0.5*(min(mpg$hwy) + max(mpg$hwy)), y = min(mpg$cty), vjust = 0) +
  annotate("text", label = "right", 
           x =  max(mpg$hwy), y = 0.5*(min(mpg$cty) + max(mpg$cty)), hjust = 1) +
  annotate("text", label = "left", 
            x =  min(mpg$hwy), y = 0.5*(min(mpg$cty) + max(mpg$cty)), hjust = 0)

sp   
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


jdo*_*res 6

geom_text想要根据您的数据集绘制标签。听起来您想在绘图中添加单个文本,在这种情况下,这annotate是更好的选择。要强制标签显示在相同位置,而不管图形中的单位如何,您可以利用以下Inf值:

sp <- ggplot(mpg, aes(hwy, cty, label = "sometext"))+
  geom_point() +
  annotate(geom = 'text', label = 'sometext', x = -Inf, y = Inf, hjust = 0, vjust = 1)
print(sp)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


Hen*_*rik 5

ggpmisc::geom_text_npc所述xy位置在NPC单元(0-1)给出。但是,位置也可以指定为“单词”:

d = data.frame(x = rep(c("left", "center", "right"), each = 3),
               y = rep(c("bottom", "middle", "top"), 3))
d$lab = with(d, paste0(x, "-", y))
d
#        x      y           lab
# 1   left bottom   left-bottom
# 2   left middle   left-middle
# 3   left    top      left-top
# 4 center bottom center-bottom
# 5 center middle center-middle
# 6 center    top    center-top
# 7  right bottom  right-bottom
# 8  right middle  right-middle
# 9  right    top     right-top

ggplot(d) +
  geom_text_npc(aes(npcx = x.chr, npcy = y.chr, label = lab))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明