我正在使用egg::arrange
设置多个图,并且在为两个图正确设置x轴大小时,x轴值未对齐。通过示例更容易解释:
data <- data.frame(
volume=c(100,200,150,400),
revenue=c(1000,2500,1750,6000),
day=c(as.Date('2019-10-01'),as.Date('2019-10-02'),as.Date('2019-10-03'),as.Date('2019-10-04'))
)
p1 <- ggplot(data, aes(x=day,y=volume)) + geom_line()
p2 <- ggplot(data, aes(x=day,y=revenue)) + geom_col()
egg::ggarrange(p1,p2,nrow=2,heights=c(3,1))
期望的输出将是每个日在地块之间对齐。最好的是将x轴完全从第一个绘图中删除。
理想情况下,这将与其他egg::ggarrange
组成,因为我实际上是在组合一堆情节。
谢谢!
答案 0 :(得分:1)
我认为这里的挑战来自ggplot如何针对折线图(数据在数据点结束)和条形图(条形图是数据分辨率的90%宽)如何不同地扩展比例。沿任一方向额外延长了0.45天。
因此,如果ggplot向两个图表添加5%(默认值),则第一个图表将在绘制数据之前“一天的15%”(3天x 5%)开始。条形图在条形图之前的“一天的19.5%”(3.9天x 5%)开始,该条形图在10月1日点之前0.45天开始。
要使第一个图表对齐,可以进行数学运算并使用
p1 <- ggplot(data, aes(x=day,y=volume)) + geom_line() +
scale_x_date(labels = NULL, name = "",
expand = expand_scale(add = 0.645))
# 0.645 = 0.45 for half of a bar + 3.9 x 5%
获得对齐:
但是,将任意的填充垫分配给该线并进一步扩展条形图0.45可能会更容易:
p1 <- ggplot(data, aes(x=day,y=volume)) + geom_line() +
scale_x_date(labels = NULL, name = "",
expand = expand_scale(add = 0.65))
p2 <- ggplot(data, aes(x=day,y=revenue)) + geom_col() +
scale_x_date(labels = NULL, name = "",
expand = expand_scale(add = 0.20))
egg::ggarrange(p1,p2,nrow=2,heights=c(3,1))