R:填充多条线之间的区域,没有清晰的最大线和最小线

R:填充多条线之间的区域,没有清晰的最大线和最小线,r,ggplot2,R,Ggplot2,我有一个数据帧df,如下所示。有五个不同的x值(10,20,30,40,50)和四个不同的设置值 x settings coherence_mean 10 alpha=0.05, beta=0.01 -119.1121 10 alpha=0.1, beta=0.01 -118.5555 10 alpha=0.05, beta=0.1 -119.3970 10 alp

我有一个数据帧
df
,如下所示。有五个不同的
x值(10,20,30,40,50)和四个不同的
设置值

 x                   settings   coherence_mean
10      alpha=0.05, beta=0.01        -119.1121
10       alpha=0.1, beta=0.01        -118.5555
10       alpha=0.05, beta=0.1        -119.3970
10        alpha=0.1, beta=0.1        -118.6293
20      alpha=0.05, beta=0.01        -127.0716
20       alpha=0.1, beta=0.01        -127.0320
我创建了一个线形图,其中数据按
设置
列分组:

ggplot(data = df, aes(x=t, y=coherence_mean, group = settings)) + 
  geom_line(aes(colour=settings))


如何填充所有行的最大值和最小值之间的区域?

最简单的方法是创建第二个数据框,对数据集进行汇总

以下是一个通用数据集示例:

set.seed(123)
df <- data.frame(t = c(rep(10,4), rep(20,4), rep(30,4)), settings = rep(c("Group 1", "Group 2", "Group 3", "Group 4"),3), mean = rnorm (12, 10))
aggregate
功能可用于按组汇总列表:

# Find range
rangemin <- aggregate(df$mean, by = list(df$t), min)
rangemax <- aggregate(df$mean, by = list(df$t), max)
range <- merge(rangemin, rangemax, by = "Group.1")
names(range) <- c("Group", "min", "max")

我觉得这需要另一个答案。上一个答案的问题是它没有正确地遵循规则。这是因为它取的是10、20和30点的最大值。这意味着,如果线路中途相互拦截,公式将不会跟踪线路

为了使线更好地跟踪最小值,我们需要插值点:

library(data.table)
library(ggplot2)    

set.seed(123)
df <- data.frame(t = c(rep(10,4), rep(20,4), rep(30,4)), settings = rep(c("Group 1", "Group 2", "Group 3", "Group 4"),3), mean = rnorm (12, 10))


# Creates a new, interpolated dataset
df_dt <- data.table(df)
df_dt_int <- df_dt[, approx(x = t,y = mean, xout=seq(from = 10, to = 30, by = 0.1)), by= settings]

# Calculates the range of the interpolated dataset
rangemin <- aggregate(df_dt_int$y, by = list(df_dt_int$x), min)
rangemax <- aggregate(df_dt_int$y, by = list(df_dt_int$x), max)
range <- merge(rangemin, rangemax, by = "Group.1")
names(range) <- c("Group", "min", "max")
range

ggplot() + 
  geom_ribbon(data = range, aes(ymin = min, ymax = max, x = Group), fill = "skyblue2", alpha = 0.5) +
  geom_line(data = df, aes(x=t, y=mean, group = settings, colour=settings))
库(data.table)
图书馆(GG2)
种子集(123)

df创建一个新变量,该变量查看四个设置并取最大值(第二个取最小值)。然后用这两个函数创建一个
geom_ribbon()
我已经回答了这个问题。今后,请在帖子中加入可用版本的数据,以便于回答。为此,您可以将代码的输出
dput(df)
复制并粘贴到postwill do中,非常感谢!乐于帮助:如果您对答案感到满意,请将其标记为已接受:@Selina,这解决了您的问题吗?如果答案有,请将其标记为已接受:)
ggplot() + 
  geom_ribbon(data = range, aes(ymin = min, ymax = max, x = Group), fill = "skyblue2", alpha = 0.5) +
  geom_line(data = df, aes(x=t, y=mean, group = settings, colour=settings))
library(data.table)
library(ggplot2)    

set.seed(123)
df <- data.frame(t = c(rep(10,4), rep(20,4), rep(30,4)), settings = rep(c("Group 1", "Group 2", "Group 3", "Group 4"),3), mean = rnorm (12, 10))


# Creates a new, interpolated dataset
df_dt <- data.table(df)
df_dt_int <- df_dt[, approx(x = t,y = mean, xout=seq(from = 10, to = 30, by = 0.1)), by= settings]

# Calculates the range of the interpolated dataset
rangemin <- aggregate(df_dt_int$y, by = list(df_dt_int$x), min)
rangemax <- aggregate(df_dt_int$y, by = list(df_dt_int$x), max)
range <- merge(rangemin, rangemax, by = "Group.1")
names(range) <- c("Group", "min", "max")
range

ggplot() + 
  geom_ribbon(data = range, aes(ymin = min, ymax = max, x = Group), fill = "skyblue2", alpha = 0.5) +
  geom_line(data = df, aes(x=t, y=mean, group = settings, colour=settings))