在ggplot中标记段的中点

时间:2018-05-03 21:07:05

标签: r ggplot2

在下面的图中,我想用 #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

2 个答案:

答案 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'))))

enter image description here

答案 1 :(得分:3)

通过大量整理,有两种方法可以做到这一点。如果您考虑中点的坐标只是x值的平均值和2个端点的y值的平均值,则无需手动执行任何操作。第一种方法是整理数据框,计算中点,然后再将其宽,以得到x和y列。该数据框进入ggplot,因此它会传递给所有地理位置,但我们会覆盖datageom_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。