如何在R中的多面板图中标记最大值点?

5

我看到有人提出了类似的问题(ggplot2和facet_grid:为每个图表添加最高值),但我仍然无法解决我的问题。

以这个为例:

data.frame(x=rnorm(100),y=rnorm(100),z=rep(c("A","B"))) %>% ggplot(aes(x,y)) + geom_point() + facet_wrap(~z)

faceted plot with randomized points

我希望只标记每个图中最大的y值点。我想使用+ geom_label_repel(aes(label=y)),但最终我标记了所有点。
我还尝试过+ geom_label(data=.[.$y==max(.$y),], aes(label=y)),其中我认为.应该是一个管道运算符左侧参数的占位符, 但这样做不起作用。
奇怪的是:我还想在不将数据框分配给全局环境变量的情况下完成此操作,因此我正在使用管道运算符。我们可以在不分配任何变量的情况下完成这项工作吗?
2个回答

6

您可以通过筛选原始数据集并将其作为"text geom"的"data"参数传递来实现此操作。这看起来有点奇怪(您必须使用"."运算符引用dplyr链的数据集,我个人不太喜欢),但它绝对可行,而且您不需要外部引用数据。

set.seed(1222)

data.frame(x=rnorm(100),y=rnorm(100),z=rep(c("A","B"))) %>% 
  ggplot(aes(x,y)) + geom_point() + 
  geom_label(data = . %>% group_by(z) %>% filter(y == max(y)), aes(label = sprintf('%0.2f', y)), hjust = -0.5) +
  facet_wrap(~z)

enter image description here


2
如果您不想在ggplot中显示管道符号,可以将上述代码修改如下:
set.seed(1222)
data.frame(x=rnorm(100),y=rnorm(100),z=rep(c("A","B"))) %>% 
group_by(z) %>% 
mutate(labelthis = ifelse(y==max(y), format(y, digits = 2, scientific = T), NA)) %>%
    ggplot(aes(x,y)) + 
    geom_point() + 
    ggrepel::geom_label_repel(aes(label = labelthis), min.segment.length = 0) +
    facet_wrap(~z)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接