gpt4 book ai didi

R: ggplot2 使两个 geom_tile 图具有相等的高度

转载 作者:行者123 更新时间:2023-12-04 00:08:25 25 4
gpt4 key购买 nike

我有两个 ggplot geom_tile 图,我使用 gridExtra 库中的 grid.arrange() 将它们放在一起。这是结果

library(ggplot2)
library(plyr)

p3 <- ggplot2(...)
p4 <- ggplot2(...)
grid.arrange(p3, p4, ncol=2)

Bad alignment of plots

我想得到它,以便两个图具有相同的高度并对齐。我已经摆弄了一下 gtable 来直接改变尺寸,但这似乎不起作用。
gA <- ggplot_gtable(ggplot_build(p3))
gB <- ggplot_gtable(ggplot_build(p4))
maxHeight <- unit.pmax(gA$heights[2:3], gB$heights[2:3])
gA$heights[2:3] <- maxHeight
gB$heights[2:3] <- maxHeight
grid.arrange(gA, gB, ncol=2)

错误信息:
Error in grid.Call.graphics(L_setviewport, pvp, TRUE) : 
non-finite location and/or size for viewport

有任何想法吗?

--- 可重现的例子 ---
library(ggplot2)
library(plyr)

temp_plot <- structure(list(Sample = structure(c(1L, 1L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 8L, 8L, 8L),
.Label = c("1", "2", "3", "4", "5", "6", "7", "8"), class = "factor"),
Gene = structure(c(1L, 9L, 21L, 22L, 1L, 7L, 8L, 1L, 2L, 17L, 18L, 1L, 3L, 4L, 16L, 5L, 6L, 19L, 20L, 1L, 10L, 11L, 12L, 13L, 2L, 3L, 4L, 5L, 6L, 14L, 15L),
.Label = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22"), class = "factor"),
Effect = c("fusion", "missense", "missense", "missense", "fusion", "missense", "missense", "fusion", "frameshift", "missense", "nonsense", "fusion", "missense", "missense", "missense", "missense", "missense", "missense", "missense", "fusion", "multiple", "missense", "missense", "missense", "frameshift", "nonsense", "missense", "missense", "missense", "missense", "missense"),
ind = c(1L, 2L, 1L, 2L, 1L, 2L, 3L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 6L, 7L)),
.Names = c("Sample", "Gene", "Effect", "ind"),
row.names = c(NA, -31L), class = "data.frame")

tt <- expand.grid(levels(temp_plot$Gene),levels(temp_plot$Sample))
colnames(tt) <- c("Gene", "Sample")
temp_plot2 <- merge(temp_plot,tt, all.y=T)

p3 <- ggplot(temp_plot2, aes(x=Gene, y=Sample)) +
geom_tile(aes(fill=Effect),colour="white",size=1.1) +
coord_equal() + theme_bw() + theme(axis.text.x = element_blank(),
axis.line = element_blank(), axis.title.y = element_blank(), axis.title.x = element_blank(),
axis.ticks.y = element_blank(), axis.ticks.x = element_blank(),
panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.border = element_blank(), panel.background = element_blank(),
legend.position = "none" )

temp_collapse_plot <- ddply(temp_plot, .(Sample), function(df){
df <- df[order(df$Gene),]
df <- unique(df)
data.frame(df,ind=1:nrow(df))
})

p4 <- ggplot(temp_collapse_plot, aes(y=Sample, x=ind)) +
geom_tile(aes(fill=Effect), colour="white", size=1.1) + coord_equal() +
scale_x_discrete(labels=levels(temp_plot$Gene)[order(nchar(levels(temp_plot$Gene)), decreasing=T)]) +
theme_bw() + theme(axis.line = element_blank(),
axis.text.x = element_blank(), axis.text.y = element_blank(),
axis.ticks.x = element_blank(), axis.title.y = element_blank(),
axis.ticks.y = element_blank(), axis.title.x = element_blank(),
panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.border = element_blank(), panel.background = element_blank())

最佳答案

enter image description here

p3b <- ggplot_build(p3)
p4b <- ggplot_build(p4)
g3 = ggplot_gtable(p3b) ; g4 = ggplot_gtable(p4b)

# work out the number of horizontal tiles
n3 <- length(p3b[["panel"]][["ranges"]][[1]][["x.major_source"]])
n4 <- length(p4b[["panel"]][["ranges"]][[1]][["x.major_source"]])

require(gtable)
require(grid)
g <- cbind(g3, g4, size = "first")
#adjust the panel widths in proportion to n4/n3
panels <- g$layout$l[grep("panel", g$layout$name)]
g$widths[panels] <- lapply(c(1,n4/n3), unit, "null")
grid.newpage()
grid.draw(g)

关于R: ggplot2 使两个 geom_tile 图具有相等的高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24188986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com