我有一些数据,例如:
somedata <- data.frame("x" = 1:3, "7"= 1:3,
"Label" = c("green","blue", "na"),
"Bold" = c('snake', 'na', 'dog'))
我想使用以下条件生成带有标签的图形:
Label
有一个值,则该值直接在数据点下方。 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
?
答案 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')
答案 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))
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