因此,我尝试使用ggplot()
绘制几条曲线,并且希望将每条曲线放在facet_grid
中的自己的图中。所有这些都很好。
问题在于我还想用与x
峰值对应的y
值对曲线进行注释。我尝试使用geom_text()
,并尝试实现如下所示的方法,但是它似乎不太可行。显然,这是在情节上打印某物,但不是我希望的那样;也就是说,每个图在位置x
上都印有对应的(x, max(y))
值。
我怀疑我没有正确实现ifelse()
,但是我对R
经验不足,无法确定问题到底出在哪里。
关于我要去哪里的任何建议?
数据+代码:
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)
答案 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)
答案 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)