具有不同y轴尺度的刻面图

时间:2016-08-05 17:59:54

标签: r ggplot2

绘制具有不同比例的多个方面。简单的例子:

require(data.table)
require(ggplot2)

nr <- 10000
inp.dt <- rbind(
    data.table(type="A", month=sample(seq(as.Date("2011/1/1"), as.Date("2012/1/1"), by="month"), nr, replace=T)),
    data.table(type="B", month=sample(seq(as.Date("2011/1/1"), as.Date("2012/1/1"), by="month"), 100*nr, replace=T))
)
plot.dt <- inp.dt[, .(count=.N), .(type,month)]

mnth <- sort(unique(plot.dt[["month"]]))
plot.dt[, ":="(type=factor(type), month=factor(month, label=format(mnth, format="%Y-%b"), ordered=TRUE))]

g <- ggplot(plot.dt, aes(x=month, y=count)) + 
    geom_bar(stat="identity") + expand_limits(y=0) + facet_grid(type~., scales="free_y")
print(g)

如果我删除scales=,则上方会变得无趣。有没有办法将这些信息显示为方面(不在单独的页面上),同时仍然传达了尺度上的巨大差异。例如,如何将顶面的ymax设置为更高的数字?

1 个答案:

答案 0 :(得分:1)

我不确定你想要的比例是什么,所以我只是随意挑选了一些数字。

require(data.table)
require(ggplot2)

nr <- 10000
inp.dt <- rbind(
  data.table(type="A", month=sample(seq(as.Date("2011/1/1"), as.Date("2012/1/1"), by="month"), nr, replace=T)),
  data.table(type="B", month=sample(seq(as.Date("2011/1/1"), as.Date("2012/1/1"), by="month"), 100*nr, replace=T))
)
plot.dt <- inp.dt[, .(count=.N), .(type,month)]

mnth <- sort(unique(plot.dt[["month"]]))
plot.dt[, ":="(type=factor(type), month=factor(month, label=format(mnth, format="%Y-%b"), ordered=TRUE))]

# g <- ggplot(plot.dt, aes(x=month, y=count)) + 
#   geom_bar(stat="identity") + expand_limits(y=0) + facet_grid(type~., scales="free_y")
# print(g)

g1 <- ggplot(plot.dt[plot.dt$type=="A",], aes(x=month, y=count)) +  scale_y_continuous(limits=c(0,1500))+
  geom_bar(stat="identity") + expand_limits(y=0) #+ facet_grid(type~., scales="free_y")
print(g1)

g2 <- ggplot(plot.dt[plot.dt$type=="B",], aes(x=month, y=count)) +   scale_y_continuous(limits=c(0,800000))+
  geom_bar(stat="identity") + expand_limits(y=0) #+ facet_grid(type~., scales="free_y")
print(g2)


install.packages("gridExtra")
library(gridExtra)
gA <- ggplotGrob(g1)
gB <- ggplotGrob(g2)


p <- arrangeGrob(
  gA, gB, nrow = 2, heights = c(0.80, 0.80))

plot(p)