R 如何用长格式处理geom_错误

R 如何用长格式处理geom_错误,r,ggplot2,R,Ggplot2,我有一个长格式的数据框“dat”,图中显示了时间序列a和b,上面和下面的误差条使用线图,但我想用geom_error()代替。当dat采用此格式时,如何将绘图更改为使用geom_error() 问题是geom_误差取ymin和ymax geom_errorbar(aes(ymax = Upper ,ymin = Lower), width = .25) 但当数据为长格式时,ymin和max为4个时间序列;上_a、下_a、上_b和下_b dat = data.frame(x= c(1,2,1

我有一个长格式的数据框“dat”,图中显示了时间序列a和b,上面和下面的误差条使用线图,但我想用geom_error()代替。当dat采用此格式时,如何将绘图更改为使用geom_error()

问题是geom_误差取ymin和ymax

 geom_errorbar(aes(ymax = Upper ,ymin = Lower), width = .25) 
但当数据为长格式时,ymin和max为4个时间序列;上_a、下_a、上_b和下_b

dat = data.frame(x= c(1,2,1,2,1,2,1,2,1,2,1,2),y = c(1,2,5,6,2,3,0,1,6,7,4,5), group = c("a","a","b","b","upper_a","upper_a","lower_a","lower_a", 
"upper_b","upper_b","lower_b","lower_b"))
ggplot(data=dat , aes(x=as.factor(x), y=y,fill=group, group= group,
                                                      color = group )) + 
  geom_line()  + geom_point()+
  scale_fill_manual( name = "Metric",   labels = c(
                                  a = "a",
                                  b = "b",
                                  upper_a = "upper a",
                                  lower_a = "lower a",
                                  upper_b ="upper b",
                                  lower_b= "lower b"),
                                    values =c(
                                  a = "red",
                                  b = "blue",
                                  upper_a = "lightpink",
                                  lower_a = "lightpink",
                                  upper_b ="lightsteelblue",
                                  lower_b= "lightsteelblue")
                         ) +
  scale_color_manual( name = "Metric",   labels = c(
                                  a = "a",
                                  b = "b",
                                  upper_a = "upper a",
                                  lower_a = "lower a",
                                  upper_b ="upper b",
                                  lower_b= "lower b"),
                                    values =c(
                                  a = "red",
                                  b = "blue",
                                  upper_a = "lightpink",
                                  lower_a = "lightpink",
                                  upper_b ="lightsteelblue",
                                  lower_b= "lightsteelblue")
                         )
通常,ggplot希望数据采用“长”格式。但是,要绘制错误项之类的内容,通常需要修改此规则,并为主值和错误值设置单独的“宽”列。因此,首先,我们可以转换您现有的数据:

library(dplyr)
library(tidyr)

dat2 <- separate(dat, group, c('measure', 'group'), fill = 'right') %>% 
    mutate(group = ifelse(is.na(group), measure, group), measure = ifelse(measure %in% c('a', 'b'), 'value', measure)) %>% 
    spread(measure, y)

  x group lower upper value
1 1     a     0     2     1
2 1     b     4     6     5
3 2     a     1     3     2
4 2     b     5     7     6
通常,ggplot希望数据采用“长”格式。但是,要绘制错误项之类的内容,通常需要修改此规则,并为主值和错误值设置单独的“宽”列。因此,首先,我们可以转换您现有的数据:

library(dplyr)
library(tidyr)

dat2 <- separate(dat, group, c('measure', 'group'), fill = 'right') %>% 
    mutate(group = ifelse(is.na(group), measure, group), measure = ifelse(measure %in% c('a', 'b'), 'value', measure)) %>% 
    spread(measure, y)

  x group lower upper value
1 1     a     0     2     1
2 1     b     4     6     5
3 2     a     1     3     2
4 2     b     5     7     6

虽然您的数据很长,但它不是一个很好的长。您的
group
列对
a/b
分组和
upper/lower/regular
分组进行了编码-jdobres的答案很好地将这些分组分为不同的列,以便可以适当地使用。虽然您的数据很长,但它不是很长。您的
group
列对
a/b
分组和
upper/lower/regular
分组进行了编码-jdobres的答案很好地将这些分组分为不同的列,以便可以适当地使用它们。
plot.new <- ggplot(data = dat2, aes(x = x, y = value, ymin = value - error, ymax = value + error, color = group)) + ...