x 轴上不同大小的刻面

Different size facets at x-axis

x 轴的长度对我的绘图很重要,因为它允许在小平面之间进行比较,因此我希望小平面具有不同的 x 轴大小。这是我的示例数据:

group1 <- seq(1, 10, 2)
group2 <-  seq(1, 20, 3)
x = c(group1, group2)
mydf <- data.frame (X =x , Y = rnorm (length (x),5,1), 
                    groups = c(rep(1, length (group1)), rep(2, length(group2))))

还有我的代码:

p1 = ggplot(data=mydf,aes(x=X,y=Y,color=factor(groups)) )+
  geom_point(size=2)+
  scale_x_continuous(labels=comma)+
  theme_bw()
p1+facet_grid(groups ~ .,scales = "fixed",space="free_x")

结果图:

Panel-1 的 x 轴值小于 10,而 panel-2 的 x 轴值扩展到 20。仍然两个面板在 x 轴上具有相同的大小。有什么方法可以使不同面板的 x 轴面板大小不同,以便它们对应于它们的(x 轴)值?

我从一些不同的包中找到了一个示例,它显示了我正在尝试做的事情,下图是:

也许这样的事情可以让你开始。不过,还有一些格式化工作要做。

library(grid)
library(gridExtra)
library(dplyr)
library(ggplot2)

p1 <- ggplot(data=mydf[mydf$groups==1,],aes(x=X,y=Y))+
  geom_point(size=2)+
  theme_bw()
p2 <- ggplot(data=mydf[mydf$groups==2,],aes(x=X,y=Y))+
  geom_point(size=2)+
  theme_bw()

summ <- mydf %>% group_by(groups) %>% summarize(len=diff(range(X)))
summ$p <- summ$len/max(summ$len)
summ$q <- 1-summ$p

ng <- nullGrob()
grid.arrange(arrangeGrob(p1,ng,widths=summ[1,3:4]),
             arrangeGrob(p2,ng,widths=summ[2,3:4]))

我确定有办法使它更通用,轴还没有完全对齐,但这是一个开始。

这是根据 OP 的澄清评论 ("I guess axis will be same but the boxes will be of variable size. Is it possible by plotting them separately and aligning in grid?") 提出的解决方案。

library(plyr); library(ggplot2)

buffer <- 0.5 # Extra space around the box

#Calculate box parameters
mydf.box <- ddply(mydf, .(groups), summarise,
      max.X = max(X) + buffer,
      min.X = 0,
      max.Y = max(Y) + buffer,
      min.Y = 0,
      X = mean(X), Y = mean(Y)) #Dummy values for X and Y needed for geom_rect


p2 <- ggplot(data=mydf,aes(x=X, y=Y) )+ 
  geom_rect(data = mydf.box, aes( xmax = max.X, xmin = min.X, 
                                  ymax = max.Y, ymin = min.Y),
            fill = "white", colour = "black", fill = NA) +
  geom_point(size=2) +  facet_grid(groups ~ .,scales = "free_y") +
  theme_classic() +
  #Extra formatting to make your plot like the example
  theme(panel.background = element_rect(fill = "grey85"),
        strip.text.y = element_text(angle = 0),
        strip.background = element_rect(colour = NA, fill = "grey65"))