谢谢Liechi 给出了简洁有效的解答。这几天看Hadley Wickham的《ggplot2:数据分析与图形艺术》,才知道原来geom_bar
函数配合权重也可以用于解决该问题,将方案贴在这里,尽管该解决方法显得略繁琐而无必要。
# 构建数据集
mydata <- data.frame("city" = rep(c("A", "B", "C"), each = 4),
"group" = rep(c("a", "b"), times = 6),
"area" = seq(1:12))
knitr::kable(mydata)
# 为了出一页多图要加载grid包
library(grid)
# 建立空白的画布
grid.newpage()
# 画上1行2列的格子框
pushViewport(viewport(layout = grid.layout(1,2)))
# 画图并储存
p1 <- ggplot(mydata, aes(city, weight = area)) + geom_bar() + ylab("area")
# 上一句用geom_col方案更好:p1 <- ggplot(mydata, aes(city, area)) + geom_col()
p2 <- ggplot(mydata, aes(group, weight = area)) + geom_bar() + ylab("area")
# 类似地,上一句用geom_col方案更好:p1 <- ggplot(mydata, aes(group, area)) + geom_col()
# 把图片打到相应位置
print(p1, vp = viewport(layout.pos.row = 1, layout.pos.col = 1))
print(p2, vp = viewport(layout.pos.row = 1, layout.pos.col = 2))
# 写成循环结构的话就是:
# 重复上面构建画布和格子框的操作
grid.newpage()
pushViewport(viewport(layout = grid.layout(1,2)))
# 准备开始循环吧
j <- 0
for (i in c("city", "group")) {
j <- j + 1
p <- ggplot(mydata, aes_string(i, "area")) + geom_col()
print(p, vp = viewport(layout.pos.row = 1, layout.pos.col = j))
}
rm(j) # 为了显得干净些删掉临时构建的对象
也可以通过分面解决:
library(tidyr)
mydata2 <- mydata %>%
pivot_longer(cols = c("city", "group"), names_to = "index", values_to = "index_value")
ggplot(mydata2, aes(index_value, area)) + geom_col() + facet_wrap(~index, scales = "free")