使用ggplot2和grid对离散和连续轴进行对齐

6
我试图展示几个变量的周汇总数据的网格图。这个图表的两个组成部分最相关的是一个分布摘要图(箱形图或小提琴图),显示某个变量在给定周内取值的情况,以及一个整数变量在几周内累积计数的累积计数图(阶梯图)。我想使用grid在一个对齐的x轴上绘制这两个图表。我将使用ggplot2来制作单独的图表,因为我喜欢Hadley Wickham(开玩笑,ggplot只是非常好用)。
问题在于geom_boxplot仅接受x轴的因子,而geom_step仅接受连续数据作为x轴。即使您使用coord_cartesianscale_x_...强制使用相似的x限制,它们也不一定对齐。
我已经拼凑出了一个使用geom_rect的黑客方法,可以适用于这个特定的应用程序,但如果例如我有其他导致单个周有多个框的因素,那么这将是一个痛苦的过程。
以下是必要的可重复生产代码:
library(ggplot2)
library(grid)

var1 <- data.frame(val = rnorm(300),
                   week = c(rep(25, 100), 
                        rep(26, 100), 
                        rep(27, 100))
                  )

var2 <- data.frame(cumul = cumsum(c(0, rpois(2, 15))),
                   week = c(25, 26, 27)
                  )


g1   <- ggplot(var1, aes(x = factor(week), y = val)) + 
  geom_boxplot()

g2   <- ggplot(var2, aes(x = week, y = cumul)) + 
  geom_step() + scale_x_continuous(breaks = 25:27)

grid.newpage()
grid.draw(rbind(ggplotGrob(g1),
                ggplotGrob(g2),
                size = "last"))

连续和离散轴不对齐的示例

而这个应急解决方法:

library(dplyr)

chiggity_check <- var1 %>% 
  group_by(week) %>% 
  summarise(week.avg = mean(val),
            week.25  = quantile(val)[2],
            week.75  = quantile(val)[4],
            week.05  = quantile(val)[1],
            week.95  = quantile(val)[5])

riggity_rect <- ggplot(chiggity_check) +
  geom_rect(aes(xmin = week - 0.25, xmax = week + 0.25,
                ymin = week.25,
                ymax = week.75)) +
  geom_segment(aes(x = week - 0.25, xend = week + 0.25,
                   y = week.avg, yend=week.avg),
               color = "white") +
  geom_segment(aes(x = week, xend = week ,
                   y = week.25, yend=week.05)) +
  geom_segment(aes(x = week, xend = week ,
                   y = week.75, yend=week.95)) +
  coord_cartesian(c(24.5,27.5)) +
  scale_x_continuous(breaks = 25:27)

grid.newpage()
grid.draw(rbind(ggplotGrob(riggity_rect),
                ggplotGrob(g2 + coord_cartesian(c(24.5,27.5))),
                size = "last"))

用临时方法拼凑的网格图示例

问题是:有没有办法将 geom_boxplot 强制转换为连续轴或者将 geom_step 转换为因子轴?或者是否有其他实现方式,例如 stat_summary,可以更加灵活,以便我可以对齐轴并且可能轻松添加像分组颜色变量这样的东西?


为了更容易地进行hack,您可以指定轴限制。例如,将“limits = c(24.55,27.45)”添加到连续比例似乎适用于您的示例。 - Roland
是的,但如果周数改变,偏移量也会相应改变。 - Dalton Hance
1个回答

5
一种方法是在x轴上使用factor(week)来绘制这两个图表,但在g2图表(即步进图)中使用geom_blank()函数使比例尺被设置。然后在geom_step()函数中,使用数字比例尺来绘制:as.numeric(factor(week))。
library(ggplot2)
library(grid)

# Your data
var1 <- data.frame(val = rnorm(300),
                   week = c(rep(25, 100), 
                        rep(26, 100), 
                        rep(27, 100))
                  )

var2 <- data.frame(cumul = cumsum(c(0, rpois(2, 15))),
                   week = c(25, 26, 27)
                  )

# Your g1
g1   <- ggplot(var1, aes(x = factor(week), y = val)) + 
  geom_boxplot()

# Modified g2
g2   <- ggplot(var2) + geom_blank(aes(x = factor(week), y = cumul)) +
geom_step(aes(x = as.numeric(as.factor(week)), y = cumul)) 

grid.newpage()
grid.draw(gridExtra::rbind.gtable(ggplotGrob(g1),
                ggplotGrob(g2),
                size = "last"))

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接