ggplot2:如何使geom_text()与facet_grid()很好地玩?

时间:2019-06-16 12:11:51

标签: r ggplot2

因此,我尝试使用ggplot()绘制几条曲线,并且希望将每条曲线放在facet_grid中的自己的图中。所有这些都很好。

问题在于我还想用与x峰值对应的y值对曲线进行注释。我尝试使用geom_text(),并尝试实现如下所示的方法,但是它似乎不太可行。显然,这是在情节上打印某物,但不是我希望的那样;也就是说,每个图在位置x上都印有对应的(x, max(y))值。

我怀疑我没有正确实现ifelse(),但是我对R经验不足,无法确定问题到底出在哪里。

关于我要去哪里的任何建议?

输出: Faceted ggplot output

数据+代码:

library('ggplot2')

x <- seq(5, 15, length=1000)
y <- dnorm(x, mean=10, sd=1)
z <- rep_len("z", length.out = 1000)
x1 <- seq(5, 15, length=1000)
y1 <- dnorm(x1, mean=10, sd=2)
z1 <- rep_len("z1", length.out = 1000)
x <- c(x, x1)
y <- c(y, y1)
z <- c(z, z1)
df <- data.frame(x, y, z)

ggplot(data = df, aes(x, y)) + geom_line() + facet_grid(.~z) + geom_text(data = df, aes(x, y, label = ifelse(y == max(y), as.numeric(x), '')), inherit.aes = FALSE, hjust = 0, vjust = 0)

编辑:我期望的输出是这样的: Expected output

3 个答案:

答案 0 :(得分:1)

您需要为data.frame提供geom_text,其中包含z和z1的数据。

          x         y  z
z  9.994995 0.3989373  z
z1 9.994995 0.1994705 z1

如何获得?好吧,这是一种方法。

df.split <- split(df, f = df$z)
df.max <- sapply(df.split, FUN = function(x) which.max(x$y))
df.max <- mapply(function(x1, x2) x1[x2, ], x1 = df.split, x2 = df.max, SIMPLIFY = FALSE)
df.max <- do.call(rbind, df.max)

然后可以绘图

ggplot(data = df, aes(x, y)) + 
  geom_line() +
  geom_text(data = df.max, aes(x = x, y = y, label = round(y, 2))) +
  facet_grid(. ~ z)

enter image description here

答案 1 :(得分:1)

您需要修复两件事。 (1)计算每z的最大值 (2)避免重复y_values

以下代码应同时解决这两个问题:

library(dplyr)
   df2 <- df %>% 
   distinct(y, .keep_all = TRUE) %>%
   group_by(z) %>%
   mutate(y_label = ifelse(y == max(y), as.numeric(x), '')) 

as.data.frame(df2)

ggplot(data = df2, aes(x, y)) + geom_line() + facet_grid(.~z) + geom_text(aes(label = y_label), hjust = 0, vjust = 0)

答案 2 :(得分:1)

获取每个z的均值和最大值:

Ys <- df %>% group_by(z) %>% summarise(maxY = max(y))
Xs <- df %>% group_by(z) %>% summarise(meanX = mean(x))

使用geom_text绘图

ggplot(data = df, aes(x, y)) +
  geom_line() + 
  geom_text(data = left_join(Xs,Ys), aes(meanX, maxY, label = meanX)) +
  facet_grid(.~z)

或更简洁

ggplot(data = df, aes(x, y)) +
  geom_line() + 
  geom_text(data = 
    df %>% 
      group_by(z) %>% 
      summarise(maxY = max(y), meanX = mean(x)),
    aes(meanX, maxY, label = meanX)) +
  facet_grid(.~z)