如何在圆形小平面包裹y轴上设置限制?

时间:2016-10-19 16:36:59

标签: r ggplot2 facet

我有这个情节,我需要围绕y轴,所以看起来是可以接受的除了我不希望在y轴上只显示1个值的事实。我想添加"限制"到" scale_y_continuous"功能,以便每个方面图的限制对于各个方面是唯一的。

这里是仅在y轴上显示60和80的图

dat = data.frame(x = c(1,2,3,1,2,3),A=c(80.6, 82,83,60,61,62),A_up =c(81,84,85,62,63,64), A_low =c(79,78,81,59,58,57), group = c("z","z","z","y","y","y"))
ggplot(data=dat , aes(x=as.factor(x), y=A, group = 1)) + #, color =Group, group = Group 
  geom_line()  + geom_point() + # facet_wrap(~COUNTERPARTY_STRATEGY ,ncol=2)
  geom_errorbar(aes(ymax = A_up ,ymin = A_low), width = .25) +
     scale_y_continuous(breaks = seq(  floor(  (min(dat$A_low)-11)  /10)*10 ,
                                   ceiling(  (max(dat$A_up)+11) /10)*10,10 ),
                      labels = seq(  floor(  (min(dat$A_low)-11)  /10)*10 ,
                                   ceiling(  (max(dat$A_up)+11) /10)*10,10 )
                      ) +
    facet_wrap(~group ,ncol=2, scales = "free_y") 

现在我在比例y连续中添加限制,并且它全局应用限制。

dat = data.frame(x = c(1,2,3,1,2,3),A=c(80.6, 82,83,60,61,62),A_up =c(81,84,85,62,63,64), A_low =c(79,78,81,59,58,57), group = c("z","z","z","y","y","y"))
ggplot(data=dat , aes(x=as.factor(x), y=A, group = 1)) + #, color =Group, group = Group 
  geom_line()  + geom_point() + # facet_wrap(~COUNTERPARTY_STRATEGY ,ncol=2)
  geom_errorbar(aes(ymax = A_up ,ymin = A_low), width = .25) +
     scale_y_continuous(breaks = seq(  floor(  (min(dat$A_low)-11)  /10)*10 ,
                                   ceiling(  (max(dat$A_up)+11) /10)*10,10 ),
                      labels = seq(  floor(  (min(dat$A_low)-11)  /10)*10 ,
                                   ceiling(  (max(dat$A_up)+11) /10)*10,10 ),
                     # limits =  c( floor(  min(dat$A_low[dat$group =="z"])  /10)*10 ,ceiling(max(dat$A_up[dat$group =="z"])/10)*10 )   
                      #limits =  c( floor(  min(dat$A_low[dat$group =="z"])  /10)*10 ,ceiling(max(dat$A_up[dat$group =="z"])/10)*10 ) 
                      limits =  c( floor(  min(dat$A_low)  /10)*10 ,ceiling(max(dat$A_up)/10)*10 ) 
                      ) +
    facet_wrap(~group ,ncol=2, scales = "free_y") 

即。

c( floor( min(dat$A_low) /10)*10 ,ceiling(max(dat$A_up)/10)*10 )

是50和90

但我希望每个方面图的限制都是唯一的,例如

所以正确的情节会有

的限制

c( floor( min(dat$A_low[dat$group =="y"]) /10)*10 ,ceiling(max(dat$A_up[dat$group =="y"])/10)*10 )

50和70

,左图的限制为

c( floor( min(dat$A_low[dat$group =="z"]) /10)*10 ,ceiling(max(dat$A_up[dat$group =="z"])/10)*10 )

70和90

如何将限制调整为特定于各个方面图?

3 个答案:

答案 0 :(得分:8)

dat = data.frame(x = c(1,2,3,1,2,3),A=c(80.6, 82,83,60,61,62),A_up =c(81,84,85,62,63,64), A_low =c(79,78,81,59,58,57), group = c("z","z","z","y","y","y"))


dat <- data.table(dat)

dat[, y_min := floor(  min(A_low)  /10)*10, by = group]
dat[, y_max := ceiling(max(A_up)/10)*10 , by = group]

ggplot(data=dat , aes(x=as.factor(x), y=A, group = 1)) + #, color =Group, group = Group 
  geom_line()  + geom_point() + # facet_wrap(~COUNTERPARTY_STRATEGY ,ncol=2)
  geom_errorbar(aes(ymax = A_up ,ymin = A_low), width = .25) +
  scale_y_continuous(breaks = seq(  floor(  (min(dat$A_low)-11)  /10)*10 ,
                                    ceiling(  (max(dat$A_up)+11) /10)*10,10 ),
                     labels = seq(  floor(  (min(dat$A_low)-11)  /10)*10 ,
                                    ceiling(  (max(dat$A_up)+11) /10)*10,10 )
  ) +
  facet_wrap(~group ,ncol=2, scales = "free_y") + 
geom_blank(aes(y = y_min)) + geom_blank(aes(y = y_max))

所以我在这里使用data.table by = group为每个组创建y_miny_max。然后在geom_blank中使用这些值来扩展绘图区域。

enter image description here

显然,这可以自动扩展到任意数量的组/方面。

答案 1 :(得分:3)

一种选择是分别制作每个刻面,然后将它们拼接在一起。这有一个额外的好处,你可以使用10以外的其他东西进行中断排序(例如,如果你的一个组从100到1000,你可以用200而不是一点点修改)。

首先,我正在创建一个计算休息时间的函数。 (如果您想要不同范围的不同比例,则可以修改此功能。)

myBreaks <- function(x){
  seq(floor( (min(x) )  /10)*10 ,
      ceiling( (max(x) ) /10)*10,
      10 )
}

然后,使用lapply根据每个组的数据子集绘制一个图:

sepPlots <- lapply(levels(dat$group), function(thisGroup){

  ggplot(data= dat[dat$group == thisGroup, ],
         aes(x=as.factor(x), y=A, group = 1)) +
    geom_line()  + geom_point() + 
    geom_errorbar(aes(ymax = A_up ,ymin = A_low), width = .25) +
    scale_y_continuous(breaks = myBreaks,
                       limits = range(myBreaks(dat[dat$group == thisGroup, c("A_up", "A_low")]))
                       ) +
    facet_wrap(~group)
})

请注意,我仍然使用facet_wrap来获得情节上方的strip - 样式标题,但如果您更喜欢这种样式,则可以使用ggtitle

然后,使用plot_grid中的cowplot将所有内容拼接在一起。请注意,如果您加载cowplot,则会设置自己的默认主题。要还原,请使用theme_set(theme_gray())

cowplot::plot_grid(plotlist = sepPlots)

给出

enter image description here

cowplot已有详细记录,因此您可以根据需要在扩展到更多群组时对绘图进行调整。

答案 2 :(得分:-4)

我没有安装ggp​​lot,但也许一个简单的if () else可以解决您的问题。我的第一次尝试是这样的:

if {
(dat$group =="y") c( floor(  min(dat$A_low[dat$group =="y"])  /10)*10, ceiling(max(dat$A_up[dat$group =="y"])/10)*10 )

else c( floor(  min(dat$A_low[dat$group =="z"])  /10)*10,     ceiling(max(dat$A_up[dat$group =="z"])/10)*10 )
}