如何在ggplot2中设置离散值之间的距离?

时间:2018-11-07 09:37:54

标签: r ggplot2

我正在尝试使用grid.arrange在一列中绘制多个图形,因为所有图形的x轴都相同。但是,不同的图形具有不同数量的离散值,导致顶部图形中的Samples与下面的图形相比距离更大。有没有一种方法可以设置轴上离散值之间的距离,以使两个图形的Sample1和Sample2线之间的距离相同?谢谢!

这里是一个例子:

library(reshape2)
library(tidyverse)
library(gridExtra)


#Data frame 1
a <- c(1,2,3,4,5)
b <- c(10,20,30,40,50)
Species <- factor(c("Species1","Species2","Species3","Species4","Species5"))
bubba <- data.frame(Sample1=a,Sample2=b,Species=Species)
bubba$Species=factor(bubba$Species, levels=bubba$Species)
xm=melt(bubba,id.vars = "Species", variable.name="Samples", value.name = "Size")

#Data frame 2
c <- c(1,2,3,4,5)
d <- c(10,20,30,40,50)
e <- c(1,2,3,4,5)
f <- c(10,20,30,40,50)
bubban <- data.frame(Sample1=c,Sample2=d,Sample3=e,Sample4=f,Species=Species)
xn=melt(bubban,id.vars = "Species", variable.name="Samples", value.name = "Size")

#Not related, but part of my original script i am using
shrink_10s_trans = trans_new("shrink_10s",
                             transform = function(y){
                               yt = ifelse(y >= 10, y*0.1, y)
                               return(yt)
                             },
                             inverse = function(yt){
                               return(yt) # Not 1-to-1 function, picking one possibility
                             }
)
#Make plot 1
p1=ggplot(xm,aes(x= Species,y= fct_rev(Samples), fill = Size < 10))+
  geom_point(aes(size=Size), shape = 21)+
  scale_size_area(trans = shrink_10s_trans, max_size = 10,
                  breaks = c(1,3,5,10,20,30,40,50),
                  labels = c(1,3,5,10,20,30,40,50)) +
  scale_fill_manual(values = c(rgb(136,93,100, maxColorValue = 255),
                               rgb(236,160,172, maxColorValue = 255))) +
  theme_bw()+theme(axis.text.x = element_text(angle = -45, hjust = 1))+scale_x_discrete(position = "top")
#Make plot 2
p2=ggplot(xn,aes(x= Species,y= fct_rev(Samples), fill = Size < 10))+
  geom_point(aes(size=Size), shape = 21)+
  scale_size_area(trans = shrink_10s_trans, max_size = 10,
                  breaks = c(1,3,5,10,20,30,40,50),
                  labels = c(1,3,5,10,20,30,40,50)) +
  scale_fill_manual(values = c(rgb(136,93,100, maxColorValue = 255),
                               rgb(236,160,172, maxColorValue = 255))) +
  theme_bw()+theme(axis.text.x = element_blank())
#arrange the plots
grid.arrange(p1,p2,nrow=2)

1 个答案:

答案 0 :(得分:0)

使用grid.extra函数代替使用ggpubr::ggarrange。它使您可以指定每个图的高度并设置共享图例。

# Using plots generated with OPs code
ggpubr::ggarrange(p1, p2, nrow = 2, heights = c(1.3, 2), 
                  common.legend = TRUE, legend = "right")

使用参数heights,您可以设置每个提供的图的相对高度。

enter image description here