x轴的不同尺寸刻面

时间:2016-01-29 21:44:36

标签: r plot ggplot2 facet

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")

由此产生的数字:

enter image description here

Panel-1的x轴值小于10,而panel-2的x轴值延伸到20.仍然是两个面板并且在x轴上具有相同的尺寸。有没有办法让不同面板的x轴面板尺寸不同,以便它们对应于它们的(x轴)值?

我从一些不同的软件包中找到了一个示例,显示了我要做的事情,这是图: enter image description here

2 个答案:

答案 0 :(得分:4)

以下是OP澄清评论后的解决方案(“我猜轴是相同的,但是盒子的大小可以变化。是否可以单独绘制它们并在网格中对齐?”)。

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")) 

p2

答案 1 :(得分:3)

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

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]))

enter image description here

我确定有一种方法可以让它变得更加通用,而且这些轴还没有完美排列,但这只是一个开始。