ggplot2:根据条件在不同位置的geom_text标签

时间:2019-02-01 04:38:52

标签: r ggplot2

我有一些数据,例如:

somedata <- data.frame("x" = 1:3, "7"= 1:3, 
                       "Label" = c("green","blue", "na"), 
                       "Bold" = c('snake', 'na', 'dog'))

我想使用以下条件生成带有标签的图形:

  1. 如果Label有一个值,则该值直接在数据点下方。
  2. 如果Label中没有值,但以粗体显示,则该值直接位于数据点下方。
  3. 如果Label和Bold中都包含值,则Label值应直接位于数据点下方,Bold值应直接位于Label值下方。

粗体栏中的值应使用粗体。

这是我到目前为止所拥有的:

ggplot(somedata, aes(x, y)) +
  geom_point(size = 3) + 
  geom_text(aes(label=Label), size=3, vjust=1.7, hjust=0.5) +
  geom_text(aes(label=Bold), size=3, vjust=1.7, hjust=0.5, fontface = 'bold')

只要Label和Bold都没有值,此方法就可以正常工作。对于green snake点,它们重叠。我如何让他们在数据点正下方读取green,并在snake正下方读取green

enter image description here

2 个答案:

答案 0 :(得分:0)

只需为一个vjust添加一个负号(我就纠正了您的数据框):

library(tidyverse)
somedata <- data.frame("x" = 1:3, "y"= 1:3, 
                       "Label" = c("green","blue", NA), 
                       "Bold" = c('snake', NA, 'dog'))
ggplot(somedata, aes(x, y)) +
  geom_point(size = 3) + 
  geom_text(aes(label=Label), size=3, vjust=-1.7, hjust=0.5) +
  geom_text(aes(label=Bold), size=3, vjust=1.7, hjust=0.5, fontface = 'bold')

enter image description here

答案 1 :(得分:0)

如果最多只有两行标签,则可以使用以下使用plotmath表达式的技巧:

somedata$actual.label <- paste0(
  "atop(",
  ifelse(somedata$Label == "na", "", as.character(somedata$Label)),
  ",",
  ifelse(somedata$Bold == "na", "",
         paste0("bold(", as.character(somedata$Bold), ")")),
  ")")

somedata$actual.label <- gsub("atop(,", "atop(",
                              somedata$actual.label,
                              fixed = TRUE)

> somedata
  x y Label  Bold            actual.label
1 1 1 green snake atop(green,bold(snake))
2 2 2  blue    na             atop(blue,)
3 3 3    na   dog         atop(bold(dog))

plot

ggplot(somedata, aes(x, y)) +
  geom_point(size = 3) +
  geom_text(aes(label = actual.label),
            vjust = 1.5, parse = TRUE) +
  coord_cartesian(ylim = c(0.5, 3)) # allow some space for the label's 2nd row