在下面的图中,我想用 #header {
padding: 2% 0% 5% 0%; /* you should control img height through here, as width will be viewport sized */
background: url('images/pool.jpg');
background-attachment: static;
background-position: center;
background-repeat: no-repeat;
background-size: cover;
z-index: 0 /* try using this to set this div below the other */
}
.second {
margin: /* negative value */
z-index: /* bootstrap items have really high numbers, so I guess this won't be necessary */
}
中的文字标记箭头。我希望这样做可以防止任何标签重叠(它们不会在下面的简单示例中)。我不想手工计算标签位置。
我熟悉使用bar$lbl
在点上获得漂亮的,非重叠的标签,并且如果有类似的方法来标记片段的中点,我会很好奇吗?
任何建议表示赞赏。
ggrepel
答案 0 :(得分:3)
我知道您不希望手动计算中间点,但是,使用统计数据来处理aesthetics
内的变量通常更容易,所以我做了之前计算中点并映射到轴
library(ggplot2)
library(directlabels) # provides a geom_dl that works easier with labels
foo <- data.frame(x=runif(50),y=runif(50))
bar <- data.frame(x1=c(0.2,0),x2=c(0.7,0.2),
y1=c(0.1,0.9),y2=c(0.6,0.5),
midx = c(0.45, 0.1), # x mid points
midy = c(0.35, 0.7), # y midpoints
lbl=c("Arrow 1", "Arrow 2"))
p1 <- ggplot(data=foo,aes(x=x,y=y))
p1 <- p1 + geom_point(color="grey")
p1 <- p1 + geom_segment(data=bar,aes(x=x1, xend=x2, y=y1, yend=y2),
size = 0.75,arrow = arrow(length = unit(0.5, "cm")))
p1 + geom_dl(data = bar, aes(x = midx, y = midy, label = lbl),
method = list(dl.trans(x = unit(x, 'cm'), y = unit(y, 'cm'))))
答案 1 :(得分:3)
通过大量整理,有两种方法可以做到这一点。如果您考虑中点的坐标只是x值的平均值和2个端点的y值的平均值,则无需手动执行任何操作。第一种方法是整理数据框,计算中点,然后再将其宽,以得到x和y列。该数据框进入ggplot
,因此它会传递给所有地理位置,但我们会覆盖data
和geom_point
的{{1}}个参数。 geom_segment
只获取geom_segment
数据框的原始副本。
bar
但也许你不想在开始时做所有的管道,或者你必须多次这样做,所以你想要一个函数来计算中点。对于第二个版本,我编写了一个函数,它基本上完成了第一个版本中library(tidyverse)
foo <- data.frame(x=runif(50),y=runif(50))
bar <- data.frame(x1=c(0.2,0),x2=c(0.7,0.2),
y1=c(0.1,0.9),y2=c(0.6,0.5),
lbl=c("Arrow 1", "Arrow 2"))
bar %>%
gather(key = coord, value = value, -lbl) %>%
mutate(coord = str_sub(coord, 1, 1)) %>%
group_by(lbl, coord) %>%
summarise(value = mean(value)) %>%
ungroup() %>%
spread(key = coord, value = value) %>%
ggplot() +
geom_point(aes(x = x, y = y), data = foo, color = "grey") +
geom_segment(aes(x = x1, y = y1, xend = x2, yend = y2), data = bar, size = 0.75, arrow = arrow(length = unit(0.5, "cm"))) +
geom_text(aes(x = x, y = y, label = lbl))
的管道传输。您为其提供了保留标签的裸列名称,即将要分组的列。然后,您可以在ggplot
中使用它。
geom_text
由reprex package(v0.2.0)创建于2018-05-03。