我有一个df
,其中包含类型为var
和link
的元素。我想使用var
将元素geom_text
绘制为文本标签,并使用links
将元素geom_curve
绘制为箭头。问题是links
对标签进行了过度绘制,而我希望它们在标签旁边开始和停止。
我所拥有的:
type x y label from_x from_y to_x to_y
1 link NA NA <NA> 608 -229 460 -276
2 link NA NA <NA> 428 -274 570 -226
3 var 610 -226 accomplishments per week 608 -229 460 NA
4 var 426 -276 hours worked per week 428 -274 570 NA
当我绘制它时,它看起来如下:
ggplot(df) + geom_text(aes(x, y, label = label)) + geom_curve(aes(x =
from_x,y = from_y,xend = to_x, yend = to_y), curvature = -.3, arrow = arrow(length = unit(0.03, "npc")), color = "red")
我期望的是:
我该如何实现?
这是我的df
:
df <- structure(list(type = structure(c(1L, 1L, 2L, 2L), .Label = c("link",
"var"), class = "factor"), x = c(NA, NA, 610, 426), y = c(NA,
NA, -226, -276), label = c(NA, NA, "accomplishments per week",
"hours worked per week"), from_x = c(610, 426, NA, NA), from_y = c(-226,
-276, NA, NA), to_x = c(426, 610, NA, NA), to_y = c(-276, -226,
NA, NA)), .Names = c("type", "x", "y", "label", "from_x", "from_y",
"to_x", "to_y"), row.names = c(NA, -4L), class = "data.frame")
这是我做的手动调整,以绘制预期的输出:
df$from_x <- c(608, 428)
df$from_y <- c(-229, -274)
df$to_x <- c(460, 570)
ggplot(df) + geom_text(aes(x, y, label = label)) + geom_curve(aes(x = from_x,y = from_y,xend = to_x, yend = to_y), curvature = -.3, arrow = arrow(length = unit(0.03, "npc")), color = "red")
答案 0 :(得分:1)
to_x
和from_y
的适当偏移量。geom_text
在堆栈的最后(即顶部)呈现df <-
df %>%
mutate(
to_xoffset = if_else(to_y > -250, to_x - 25, NA_real_),
to_xoffset = if_else(to_y < -250, to_x + 25, to_xoffset),
from_yoffset = if_else(from_x < 525, from_y + 2, NA_real_),
from_yoffset = if_else(from_x > 525, from_y - 2, from_yoffset)
)
ggplot(df) +
geom_curve(aes(x = from_x,y = from_yoffset ,xend = to_xoffset, yend = to_y), curvature = -.3, arrow = arrow(length = unit(0.03, "npc")), color = "red") +
geom_text(aes(x, y, label = label))