在grid.arrange中设置图形y轴的高度,但不设置整个绘图区域的高度
使用网格排列时,我遇到以下问题: 我希望我的所有面板(a、b、c)具有相同的大小,但由于我已从面板a和b(只有一个x轴)中删除了标签和记号,因此大小为 图a和b更大,等于图c的大小+c的标签和记号的空间。 我也不能使用在grid.arrange中设置图形y轴的高度,但不设置整个绘图区域的高度,r,ggplot2,gridextra,grob,R,Ggplot2,Gridextra,Grob,使用网格排列时,我遇到以下问题: 我希望我的所有面板(a、b、c)具有相同的大小,但由于我已从面板a和b(只有一个x轴)中删除了标签和记号,因此大小为 图a和b更大,等于图c的大小+c的标签和记号的空间。 我也不能使用ggplot2::facet_grid,因为我想单独指定y轴限制(例如a到40,b和c到15)。 下面您可以找到用于生成此绘图的工作示例,该示例基于垂直对齐绘图,但我不知道如何分别确保每个绘图的高度相同。欢迎任何指点 library(ggplot2) library(gridExt
ggplot2::facet_grid
,因为我想单独指定y轴限制(例如a到40,b和c到15)。
下面您可以找到用于生成此绘图的工作示例,该示例基于垂直对齐绘图,但我不知道如何分别确保每个绘图的高度相同。欢迎任何指点
library(ggplot2)
library(gridExtra)
# generate data
data <- data.frame(values=c(runif(20,0,40),runif(40,0,15)),product=c(rep("a",20),rep("b",20),rep("c",20)),treat=c("e","f","g","h","i"),time=c(0,6,24,48))
my_labeller <- function(var, value){
value <- as.character(value)
value <- c("a","b","c")
return(value)
}
#subset data
data_a <- data[1:20,]
data_b <- data[21:40,]
data_c <- data[41:60,]
# Make plots for all parameters seperatly:
p_a <- ggplot(data_a,fill = white,
aes(x=as.numeric(as.character(time)),y=as.numeric(as.character(values))))
p_a <- p_a+ geom_point(aes(colour=treat,shape=treat),size=4)
p_a <- p_a + geom_line(aes(colour=treat))
p_a <- p_a + theme(axis.ticks.x = element_line(colour = "grey"),
axis.ticks.y =element_line(colour = "grey"),
panel.background = element_rect(fill = "white"),
panel.grid.major=element_blank(),
panel.grid.minor=element_blank(),
axis.line = element_line(colour = "grey"),
axis.text.x = element_text(size = 15),
axis.text.y = element_text(size = 15),
axis.title.x = element_text(size =18),
axis.title.y = element_text(size=18,angle=0),
legend.text = element_text(size=15),
legend.title = element_blank(),
legend.position = "right"
)
p_a <- p_a + scale_colour_manual(values = c("#FFFF55","#000000","#0000AA","#00AA00","#00AAAA"), breaks= c("e","f","g","h","i"),
labels = c("e","f","g","h","i")
)
p_a <- p_a + scale_shape_manual(values =c(15:18,8), breaks= c("e","f","g","h","i"),
labels = c("e","f","g","h","i")
)
p_a <- p_a + guides(color = guide_legend(nrow=5),size = 16)
# p <- p+ guides(colour="legend",size="none",shape= "legend")
p_a <- p_a + scale_x_continuous(breaks= c(0,6,24,48))
p_a <- p_a + xlab("Time (h)") + ylab(paste(data_a$product, "(mM)"))
p_a <- p_a + ylim(0,40)
print(p_a)
p_b <- ggplot(data_b,fill = white,
aes(x=as.numeric(as.character(time)),y=as.numeric(as.character(values))))
p_b <- p_b+ geom_point(aes(colour=treat,shape=treat),size=4)
p_b <- p_b + geom_line(aes(colour=treat))
p_b <- p_b + theme(axis.ticks.x = element_line(colour = "grey"),
axis.ticks.y =element_line(colour = "grey"),
panel.background = element_rect(fill = "white"),
panel.grid.major=element_blank(),
panel.grid.minor=element_blank(),
axis.line = element_line(colour = "grey"),
axis.text.x = element_text(size = 15),
axis.text.y = element_text(size = 15),
axis.title.x = element_text(size =18),
axis.title.y = element_text(size=18,angle=0),
legend.text = element_text(size=15),
legend.title = element_blank(),
legend.position = "right"
)
p_b <- p_b + scale_colour_manual(values = c("#FFFF55","#000000","#0000AA","#00AA00","#00AAAA"), breaks= c("e","f","g","h","i"),
labels = c("e","f","g","h","i")
)
p_b <- p_b + scale_shape_manual(values =c(15:18,8), breaks= c("e","f","g","h","i"),
labels = c("e","f","g","h","i")
)
p_b <- p_b + guides(color = guide_legend(nrow=5),size = 16)
# p <- p+ guides(colour="legend",size="none",shape= "legend")
p_b <- p_b + scale_x_continuous(breaks= c(0,6,24,48))
p_b <- p_b + xlab("Time (h)") + ylab(paste(data_b$product, "(mM)"))
p_b <- p_b + ylim (0,15)
print(p_b)
p_c <- ggplot(data_c,fill = white,
aes(x=as.numeric(as.character(time)),y=as.numeric(as.character(values))))
p_c <- p_c+ geom_point(aes(colour=treat,shape=treat),size=4)
p_c <- p_c + geom_line(aes(colour=treat))
p_c <- p_c + theme(axis.ticks.x = element_line(colour = "grey"),
axis.ticks.y =element_line(colour = "grey"),
panel.background = element_rect(fill = "white"),
panel.grid.major=element_blank(),
panel.grid.minor=element_blank(),
axis.line = element_line(colour = "grey"),
axis.text.x = element_text(size = 15),
axis.text.y = element_text(size = 15),
axis.title.x = element_text(size =18),
axis.title.y = element_text(size=18,angle=0),
legend.text = element_text(size=15),
legend.title = element_blank(),
legend.position = "right"
)
p_c <- p_c + scale_colour_manual(values = c("#FFFF55","#000000","#0000AA","#00AA00","#00AAAA"), breaks= c("e","f","g","h","i"),
labels = c("e","f","g","h","i")
)
p_c <- p_c + scale_shape_manual(values =c(15:18,8), breaks= c("e","f","g","h","i"),
labels = c("e","f","g","h","i")
)
p_c <- p_c + guides(color = guide_legend(nrow=5),size = 16)
# p <- p+ guides(colour="legend",size="none",shape= "legend")
p_c <- p_c + scale_x_continuous(breaks= c(0,6,24,48))
p_c <- p_c + xlab("Time (h)") + ylab(paste(data_c$product, "(mM)"))
p_c <- p_c + ylim (0,15)
print(p_c)
# now remove space in between a and b and b and c
p_a <- p_a + theme(plot.margin = rep(unit(0,"null"),4),
panel.margin = unit(0,"null"),
axis.ticks.length = unit(0,"null"),
axis.ticks.margin = unit(0,"null")) +
labs(x=NULL) +
scale_x_discrete(breaks=NULL) +
guides(fill=FALSE)
p_b <- p_b + theme(plot.margin = rep(unit(0,"null"),4),
panel.margin = unit(0,"null"),
axis.ticks.length = unit(0,"null"),
axis.ticks.margin = unit(0,"null")) +
labs(x=NULL) +
scale_x_discrete(breaks=NULL) +
guides(fill=FALSE)
p_c <- p_c + theme(plot.margin = rep(unit(0,"null"),4),
panel.margin = unit(0,"null"))
# arrange them (+ align)
plots <- list(p_a,p_b,p_c)
grobs <- list()
widths <- list()
for (i in 1:length(plots)){
grobs[[i]] <- ggplotGrob(plots[[i]])
widths[[i]] <- grobs[[i]]$widths[2:5]
}
maxwidth <- do.call(grid::unit.pmax, widths)
for (i in 1:length(grobs)){
grobs[[i]]$widths[2:5] <- as.list(maxwidth)
}
do.call("grid.arrange", c(grobs, ncol = 1))
一种方法是将facet_grid与
scales=“free_y”
一起使用,并添加一些“不可见”数据,这些数据将在ggplot自动生成y轴限制时使用。如果要将自动生成的轴扩展到超出数据限制的范围,这将起作用,但如果要约束它们以排除部分数据,则不起作用:
data <- data.frame(values=c(runif(20,0,40),runif(40,0,15)),
product=c(rep("a",20),rep("b",20),rep("c",20)),
treat=c("e","f","g","h","i"),
time=c(0,6,24,48))
ggplot(data, aes(time, values, color=treat)) +
geom_line() + geom_point() +
geom_hline(data=data.frame(product=c("a", "b", "c"), values=c(40, 15, 15)),
aes(yintercept=values), color="white") +
facet_grid(product~., scales="free") +
theme(panel.background=element_blank(), panel.grid=element_blank())
data您应该使用rbind
而不是grid.arrange
plots <- list(p_a, p_b, p_c)
grobs <- lapply(plots, ggplotGrob)
# for gridExtra < v2.3, use do.call(gridExtra::rbind.gtable, grobs)
# for gridExtra >= v2.3 use:
g <- do.call(gridExtra::gtable_rbind, grobs)
library(grid)
grid.newpage()
grid.draw(g)
绘图您是否尝试过使用ggplot2::facet_grid(scales=“free_y”)或您是否需要手动指定不同的y限制,而不是自动生成?我们确实需要手动设置比例,因为如果使用scales=free_y
我们会得到这个粗略的结果(请参见:),其中绘图b和c的比例不同,然而,我希望它们的范围是0-15 mM。我得到一个错误,“error:'rbind'不是从'namespace:gridExtra'导出的对象”。我已经安装了gridExtra的最新版本。。。我错过什么了吗?
plots <- list(p_a, p_b, p_c)
grobs <- lapply(plots, ggplotGrob)
# for gridExtra < v2.3, use do.call(gridExtra::rbind.gtable, grobs)
# for gridExtra >= v2.3 use:
g <- do.call(gridExtra::gtable_rbind, grobs)
library(grid)
grid.newpage()
grid.draw(g)