我试图在R中绘制4个 Dataframe ,将它们排列为2行,第一行3,第二行1。我使用了以下代码:
library(ggplot2)
library(ggplotify)
# Loop to create 5 matrices and plot them
plot_list <- list()
grob_list <- list()
for (i in 1:4) {
# Set seed for reproducibility
set.seed(123 + i)
# Create empty matrix
mat <- matrix(nrow = 50, ncol = 4)
# Set column names
colnames(mat) <- c('a', 'b', 'c', 'd')
# Set row names to random strings
rownames(mat) <- replicate(50, paste(sample(letters, 5, replace = TRUE), collapse = ''))
# Set values in matrix
mat[sample(length(mat), 3)] <- runif(3, 10, 100) # 3 values > 10
# Identify the locations of the missing values
missing <- is.na(mat)
# Generate random values between 0 and 1 to replace the missing values
replace <- runif(sum(missing), min = 0, max = 1)
# Replace the missing values in the matrix with the random values
mat[missing] <- replace
# Convert mat to a data frame
mat_df <- as.data.frame(mat)
mat_df$names <- rownames(mat)
# Reshape the data so that it can be plotted with ggplot
mat_long <- reshape2::melt(mat_df, id.vars = "names")
# Create the dotplot with text labels and proportional dot size
p <- ggplot(mat_long, aes(x = names, y = value, fill = variable, size = value)) +
geom_point(shape = 21, show.legend = FALSE) +
scale_fill_manual(values = c("red", "green", "blue", "orange")) +
scale_size_continuous(range = c(1, 10)) +
theme_classic() +
labs(x = '', y = "Average expression level", fill = "Columns") +
facet_wrap(~ variable, ncol = 4, scales = "free_x", strip.position = "bottom") +
guides(x.sec = "axis", y.sec = "axis") +
theme(strip.placement = "outside",
strip.background = element_blank(),
strip.text = element_text(size = 14),
panel.spacing = unit(0, "cm"),
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
panel.border = element_rect(colour = "black", fill=NA, size=1),
axis.line = element_line(size = 1),
axis.ticks.x = element_blank(),
axis.text.x = element_blank(),
axis.ticks.y = element_line(colour = "black"),
text = element_text(size=20)) +
geom_text(data = subset(mat_long, value > 10), aes(label = names),
nudge_x = 0, nudge_y = 2, size = 3, check_overlap = TRUE)
# Print plot
print(p)
# Add plot to plot list
plot_list[[i]] <- p
grob_list[[i]] <- as.grob(plot_list[[i]])
}
# Arrange plots into a 2x3 grid for the first row and a 2x1 grid for the second row
grid.arrange(
arrangeGrob(grobs=grob_list[1:3], ncol = 3),
arrangeGrob(grobs=grob_list[4:5], ncol =1)
)
结果图显示,第一行的3个小区大小相同,但第二行的小区比第一行的大。你能告诉我怎样使这四块地都一样大吗?
非常感谢
1条答案
按热度按时间omvjsjqw1#
选项1
安排ggplots最简单的方法是使用
ggpubr::ggarrange
,我认为ggpubr是最好的ggplot 2附加包之一,特别是对于科学出版物的东西。我认为ggplotify
在这里是错误的调用,因为它用于将其他plot对象转换为ggplot 2-但无论如何,您只是使用ggplot对象。使用ggpubr:
选项二
gridExtra
软件包让您完全控制ggplot的排列。为了获得所需的输出(4个图),我将for循环范围从
1:5
更改为1:4
(r使用基于1的索引,并将上限包含在范围中。