具有多个y轴的分组箱

时间:2016-07-26 19:27:58

标签: r ggplot2 axis

我有一个包含五列五行的数据框。数据框如下所示:

df <- data.frame(
  day=c("m","t","w","t","f"),
  V1=c(5,10,20,15,20),
  V2=c(0.1,0.2,0.6,0.5,0.8),
  V3=c(120,100,110,120,100),
  V4=c(1,10,6,8,8)
)

我想做一些情节所以我使用了ggplot,尤其是geom_bar

ggplot(df, aes(x = day, y = V1, group = 1)) + ylim(0,20)+ geom_bar(stat = "identity")
ggplot(df, aes(x = day, y = V2, group = 1)) + ylim(0,1)+ geom_bar(stat = "identity")
ggplot(df, aes(x = day, y = V3, group = 1)) + ylim(50,200)+ geom_bar(stat = "identity")
ggplot(df, aes(x = day, y = V4, group = 1)) + ylim(0,15)+ geom_bar(stat = "identity")

我的问题是,如何使用多个y轴ggplot进行分组geom_bar?我希望在x轴的每一天和每天我想要绘制四个箱V1,V2,V3,V4,但具有不同的范围和颜色。这可能吗?

修改

我希望y轴看起来像这样:

multiple axis

3 个答案:

答案 0 :(得分:1)

首先,我按照问题下方链接中的文档中所述进行了重新整形。 一般来说,ggplot不支持多个y轴。我认为这是一个哲学上的事情。但也许分面对你有用。

df <- read.table(text =  "day V1 V2 V3 V4 
                          m   5  0.1 120 1
                          t   10 0.2 100 10
                          w   2  0.6 110 6
                          t   15 0.5 120 8
                          f   20 0.8 100 8", header = TRUE)

library(reshape2)
df <- melt(df, id.vars = 'day')

ggplot(df, aes(x = variable, y = value, fill = variable)) + geom_bar(stat = "identity") + facet_grid(.~day)

enter image description here

答案 1 :(得分:1)

require(reshape)
data.m <- melt(df, id.vars='day')
ggplot(data.m, aes(day, value)) +   
  geom_bar(aes(fill = variable), position = "dodge", stat="identity") +
  facet_grid(variable ~ .)

enter image description here

如果您愿意,也可以更改y轴限制(此处为example)。

或者你可能意味着像这样分组:

require(reshape)
data.m <- melt(df, id.vars='day')
ggplot(data.m, aes(day, value)) +   
  geom_bar(aes(fill = variable), position = "dodge", stat="identity")

enter image description here

对于后面的示例,如果您想要2个Y轴,那么您只需创建两次图(一次使用左侧y轴,一次使用右侧y轴),然后使用此功能:

double_axis_graph <- function(graf1,graf2){
  graf1 <- graf1
  graf2 <- graf2
  gtable1 <- ggplot_gtable(ggplot_build(graf1))
  gtable2 <- ggplot_gtable(ggplot_build(graf2))
  par <- c(subset(gtable1[['layout']], name=='panel', select=t:r))
  graf <- gtable_add_grob(gtable1, gtable2[['grobs']][[which(gtable2[['layout']][['name']]=='panel')]],

                          par['t'],par['l'],par['b'],par['r'])
  ia <- which(gtable2[['layout']][['name']]=='axis-l')
  ga <- gtable2[['grobs']][[ia]]
  ax <- ga[['children']][[2]]
  ax[['widths']] <- rev(ax[['widths']])
  ax[['grobs']] <- rev(ax[['grobs']])
  ax[['grobs']][[1]][['x']] <- ax[['grobs']][[1]][['x']] - unit(1,'npc') + unit(0.15,'cm')
  graf <- gtable_add_cols(graf, gtable2[['widths']][gtable2[['layout']][ia, ][['l']]], length(graf[['widths']])-1)
  graf <- gtable_add_grob(graf, ax, par['t'], length(graf[['widths']])-1, par['b'])

  return(graf)
}

我相信还有一个包或便利功能可以做同样的事情。

答案 2 :(得分:1)

如果我理解正确,你想在你的情节中加入facets。您必须使用reshape2以正确的格式获取数据。以下是您的数据示例:

df <- data.frame(
  day=c("m","t","w","t","f"),
  V1=c(5,10,20,15,20),
  V2=c(0.1,0.2,0.6,0.5,0.8),
  V3=c(120,100,110,120,100),
  V4=c(1,10,6,8,8)
)

library(reshape2)

df <- melt(df, "day")

然后绘制并包含facet_grid参数:

ggplot(df, aes(x=day, y=value)) + geom_bar(stat="identity", aes(fill=variable)) + 
  facet_grid(variable ~ .)

enter image description here