突出显示 R 中多面 ggplot2 图中的最小点和最大点

Highlight minimum and maximum points in faceted ggplot2 graph in R

我在 R 中使用内置的 economics(来自 ggplot2 包)数据集,并使用以下代码为同一图中的每个变量绘制时间序列:

library(reshape2)
library(ggplot2)

me <- melt(economics, id = c("date"))
ggplot(data = me) + 
     geom_line(aes(x = date, y = value)) +
     facet_wrap(~variable, ncol = 1, scales = 'free_y')

现在,我想进一步细化我的图表,对于每个系列,我想为最小值和最大值显示一个红点。 所以我想如果我能找到每个时间序列的最小值和最大值的坐标,我就能找到一种方法在每个时间序列的开始和结束处绘制一个红点。为此,我使用了以下代码:

which(pce == min(economics$pce), arr.ind = TRUE) 
which(pca == max(pca), arr.ind = TRUE)

这并没有真正引导我到任何地方。 谢谢:)

方法 1:使用联接

当您想保存过滤后的子集时,这会很好


library(reshape2)
library(ggplot2)
library(dplyr)

me <- melt(economics, id=c("date"))

me %>%
  group_by(variable) %>%
  summarise(min = min(value),
            max = max(value)) -> me.2

left_join(me, me.2) %>%
  mutate(color = value == min | value == max) %>%
  filter(color == TRUE) -> me.3

ggplot(data=me, aes(x = date, y = value)) + 
  geom_line() +
  geom_point(data=me.3, aes(x = date, y = value), color = "red") +
  facet_wrap(~variable, ncol=1, scales='free_y')

方法 2:无连接简化

感谢@Gregor

me.2 <- me %>%
  group_by(variable) %>%
  mutate(color = (min(value) == value | max(value) == value))

ggplot(data=me.2, aes(x = date, y = value)) +
  geom_line() +
  geom_point(aes(color = color)) +
  facet_wrap(~variable, ncol=1, scales="free_y") +
  scale_color_manual(values = c(NA, "red"))