问题描述
用ggplot::facet_grid()
作图时,有时会因为数据量级差异太大,导致有些小图难以看清楚。虽然该函数有个scales
参数,但是设置scales = "free"
只能改变各列的纵坐标范围,而无法让行内各图的纵坐标轴范围根据需求而改变。具体代码和结果如下。
代码及结果
# 构建数据
mydata <- data.frame(city = rep(c("A", "B"), each = 4),
var = rep(rep(c("a", "b"), each = 2), 2),
time = rep(1:2, 4),
value = c(1, 2, 10, 20, 3, 4, 300, 400))
# 作图
library(ggplot2)
ggplot(mydata) + geom_col(aes(time, value)) +
facet_grid(city ~ var)
结果如下:
可见左上、右上和左下图均因为量级太小而难以看清。
# facet_grid()的scales = "free"可让各列横纵坐标轴范围按需而定
ggplot(mydata) + geom_col(aes(time, value)) +
facet_grid(city ~ var, scales = "free")
结果如下:
现在上面一行的纵坐标轴根据需求做了调整,右上图可以看清了,但是左上和左下图仍然看不清楚。
想要解决这个办法,当然可以通过一些拼图包实现,比如说ggpubr
或者patchwork
包。
library(patchwork)
p1 <- ggplot(mydata[which(mydata$city == "A"), ]) + geom_col(aes(time, value)) +
facet_wrap(.~ var, scales = "free") +
labs(title = "(city A)")
p2 <- ggplot(mydata[which(mydata$city == "B"), ]) + geom_col(aes(time, value)) +
facet_wrap(.~ var, scales = "free") +
labs(title = "(city B)")
p1 / p2
结果是:
但是这样逻辑条理不如facet_grid()
清晰,上下行的图也没有对齐得很好。想请教是否有更好的解决方案呢?