ggplot facet网格条形图上的不同y限制?

时间:2015-05-16 20:37:10

标签: r ggplot2

我的数据:

    day variable      value
1  Fri     avg1 446.521127
2  Mon     avg1 461.676056
3  Sat     avg1 393.366197
4  Sun     avg1 435.985714
5  Thu     avg1 445.571429
6  Tue     avg1 441.549296
7  Wed     avg1 462.042254
8  Fri     avg2   7.442113
9  Mon     avg2   7.694648
10 Sat     avg2   6.556056
11 Sun     avg2   7.266571
12 Thu     avg2   7.426286
13 Tue     avg2   7.359577
14 Wed     avg2   7.700282

我的问题是我想使用facet_grid创建一个条形图,每天显示每组平均数据,但观察结果相似,我发现使用{{指定y限制很有帮助1}}。

所以,如果我将我的ggplot分配给scale_y_continuous,我可以得到我想要的一半:

g <- ggplot(df, aes(x=day, y=value))

g + geom_bar(stat="identity") + facet_grid(variable~., scales="free")

但是,我不知道如何使用构面网格然后指定一个scale_y_cont来限制单独的y轴的大小。有解决方案吗?

2 个答案:

答案 0 :(得分:9)

使用geom_point时,您可以为不同的方面创建单独的y范围,但我不知道如何使用geom_bar来完成此操作。要使用facet_wrapgeom_bar设置特定的y范围,我知道的唯一方法是创建单独的绘图,然后使用grid.arrange中的gridExtra将它们并排放置包。 (使用不会降至零的垂直刻度会夸大点/条之间的差异,这可能会产生误导,但您必须决定它是否对您的特定情况有意义。)

首先,这里是geom_point版本:我们的想法是创建一个&#34;虚拟&#34;数据框,你想要ylim的低和高值,然后&#34; plot&#34;他们使用geom_blankgeom_blank不会绘制任何内容,但添加此geom将确保轴范围是您希望每个方面的范围。

ddummy = data.frame(day=NA, variable=rep(c("avg1", "avg2"), each=2), 
               value=c(0.5*max(df$value[df$variable=="avg1"]), 
                       1.1*max(df$value[df$variable=="avg1"]),
                       0.5*max(df$value[df$variable=="avg2"]), 
                       1.1*max(df$value[df$variable=="avg2"])))

g <- ggplot(df, aes(x=day, y=value))

g + geom_point() + 
  geom_blank(data=dummy, aes(day, value)) +
  facet_grid(variable ~ ., scales="free")

enter image description here

以下是单独的情节,与grid.arrange

放在一起
avg1 = ggplot(df[df$variable=="avg1",], aes(x=day, y=value)) +
  geom_bar(stat="identity") +
  facet_wrap(~variable) +
  coord_cartesian(ylim=c(300,500))

avg2 = ggplot(df[df$variable=="avg2",], aes(x=day, y=value)) +
  geom_bar(stat="identity") +
  facet_wrap(~variable) +
  coord_cartesian(ylim=c(3.5,8))

gridExtra::grid.arrange(avg1, avg2, ncol=2)

enter image description here

要使用geom_segment(根据您的评论),您可以这样做:

library(dplyr)

ggplot(df %>% group_by(variable) %>%
         mutate(ymin=0.5*max(value))) +
  geom_segment(aes(x=day, xend=day, y=ymin, yend=value), 
               size=5, colour=hcl(195,100,65)) + 
  facet_grid(variable ~ ., scales="free")

答案 1 :(得分:0)

实际上,当涉及到 scales = 'free' 函数时,geom_bar 选项也适用于我。我的代码块如下:

    merged_no_country_year %>% 
      ggplot(aes(x=age, y=outcome_values/1000000)) + 
      geom_bar(stat="identity", fill="skyblue", alpha=1.0) + 
      theme_minimal() +
      facet_grid(outcome~source, scales = 'free') + 
      labs(y='people (in millions)')