我在 R 中使用 cowplot 和 ggplot2 的 plot_grids 缺少网格中的四个图之一?

Posted

技术标签:

【中文标题】我在 R 中使用 cowplot 和 ggplot2 的 plot_grids 缺少网格中的四个图之一?【英文标题】:My plot_grids using cowplot in R with ggplot2 are missing one of the four plots in the grid? 【发布时间】:2022-01-03 07:33:21 【问题描述】:

对不起,我发布了多少代码,但我错过了使用 plot_grid 和包cowplot的四个ggplots之一,网格中应该有四个,并且由于某种原因其中一个丢失了,确实有人知道为什么吗?

这是缺少四个图表之一的 plot_grids:

这是错误:

> plot_grid("ANN Models with 08 Learning Rate", plot3_08, plot10_08, plot20_08, plot50_08, labels = c("N3", "N10", "N20", "N50"), ncol = 2, nrow = 2)
Warning message:
In as_grob.default(plot) :
  Cannot convert object of class character into a grob.

这是可重现的代码:

library(Rcpp)
library(RSNNS)
library(ggplot2)
library(plotROC)
library(tidyr)
library(cowplot)

setwd("**set working directory**")
data <- read.csv("WDBC.csv", header=T)
data <- data[,1:4]
data <- scale(data)  # normalizes the data

numHneurons3 = 3
numHneurons10 = 10
numHneurons20 = 20
numHneurons50 = 50

DecTargets = decodeClassLabels(data[,4])

train.test3 <- splitForTrainingAndTest(data, DecTargets,ratio = 0.50) # split
train.test10 <- splitForTrainingAndTest(data, DecTargets,ratio = 0.50) # split
train.test20 <- splitForTrainingAndTest(data, DecTargets,ratio = 0.50) # split
train.test50 <- splitForTrainingAndTest(data, DecTargets,ratio = 0.50) # split

model3_02 <- mlp(train.test3$inputsTrain, train.test3$targetsTrain,  # build model3
           size = numHneurons3, learnFuncParams = c(0.02),maxit = 10000, 
           inputsTest = train.test3$inputsTest, 
           targetsTest = train.test3$targetsTest)
model3_08 <- mlp(train.test3$inputsTrain, train.test3$targetsTrain,  # build model3
           size = numHneurons3, learnFuncParams = c(0.08),maxit = 10000, 
           inputsTest = train.test3$inputsTest, 
           targetsTest = train.test3$targetsTest)

model10_02 <- mlp(train.test10$inputsTrain, train.test10$targetsTrain, # build model10
           size = numHneurons10, learnFuncParams = c(0.02),maxit = 10000, 
           inputsTest = train.test10$inputsTest, 
           targetsTest = train.test10$targetsTest)

model10_08 <- mlp(train.test10$inputsTrain, train.test10$targetsTrain, # build model10
           size = numHneurons10, learnFuncParams = c(0.08),maxit = 10000, 
           inputsTest = train.test10$inputsTest, 
           targetsTest = train.test10$targetsTest)

model20_02 <- mlp(train.test20$inputsTrain, train.test20$targetsTrain, # build model20
           size = numHneurons20, learnFuncParams = c(0.02),maxit = 10000, 
           inputsTest = train.test20$inputsTest, 
           targetsTest = train.test20$targetsTest)

model20_08 <- mlp(train.test20$inputsTrain, train.test20$targetsTrain, # build model20
           size = numHneurons20, learnFuncParams = c(0.08),maxit = 10000, 
           inputsTest = train.test20$inputsTest, 
           targetsTest = train.test20$targetsTest)

model50_02 <- mlp(train.test50$inputsTrain, train.test50$targetsTrain, # build model50
           size = numHneurons50, learnFuncParams = c(0.02),maxit = 10000, 
           inputsTest = train.test50$inputsTest, 
           targetsTest = train.test50$targetsTest)

model50_08 <- mlp(train.test50$inputsTrain, train.test50$targetsTrain, # build model50
           size = numHneurons50, learnFuncParams = c(0.08),maxit = 10000, 
           inputsTest = train.test50$inputsTest, 
           targetsTest = train.test50$targetsTest)

trainFitTar3_02 <- cbind(fitted.values(model3_02), train.test3$targetsTrain)
predictions = predict(model3_02, train.test3$inputsTest)

trainFitTar3_08 <- cbind(fitted.values(model3_08), train.test3$targetsTrain)
predictions = predict(model3_08, train.test3$inputsTest)

trainFitTar10_02 <- cbind(fitted.values(model10_02), train.test10$targetsTrain)
predictions = predict(model10_02, train.test10$inputsTest)

trainFitTar10_08 <- cbind(fitted.values(model10_08), train.test10$targetsTrain)
predictions = predict(model10_08, train.test10$inputsTest)

trainFitTar20_02 <- cbind(fitted.values(model20_02), train.test20$targetsTrain)
predictions = predict(model20_02, train.test20$inputsTest)

trainFitTar20_08 <- cbind(fitted.values(model20_08), train.test20$targetsTrain)
predictions = predict(model20_08, train.test20$inputsTest)

trainFitTar50_02 <- cbind(fitted.values(model50_02), train.test50$targetsTrain)
predictions = predict(model50_02, train.test50$inputsTest)

trainFitTar50_08 <- cbind(fitted.values(model50_08), train.test50$targetsTrain)
predictions = predict(model50_08, train.test50$inputsTest)

#--------------------------------------
#     GGPlots of the Iterative Error:
#--------------------------------------

test_error_m302 <- model3_02$IterativeTestError
train_error_m302 <- model3_02$IterativeFitError

test_error_m308 <- model3_08$IterativeTestError
train_error_m308 <- model3_08$IterativeFitError



test_error_m1002 <- model10_02$IterativeTestError
train_error_m1002 <- model10_02$IterativeFitError

test_error_m1008 <- model10_08$IterativeTestError
train_error_m1008 <- model10_08$IterativeFitError



test_error_m2002 <- model20_02$IterativeTestError
train_error_m2002 <- model20_02$IterativeFitError

test_error_m2008 <- model20_08$IterativeTestError
train_error_m2008 <- model20_08$IterativeFitError



test_error_m5002 <- model50_02$IterativeTestError
train_error_m5002 <- model50_02$IterativeFitError

test_error_m5008 <- model50_08$IterativeTestError
train_error_m5008 <- model50_08$IterativeFitError



error_df_m3_02 <- data.frame(iter = c(seq_along(test_error_m302),
                                      seq_along(train_error_m302)),
                             Error = c(test_error_m302, train_error_m302), 
                             type = c(rep("test", length(test_error_m302)),
                                      rep("train", length(train_error_m302))
                             ))


error_df_m3_08 <- data.frame(iter = c(seq_along(test_error_m308),
                                      seq_along(train_error_m308)),
                             Error = c(test_error_m308, train_error_m308), 
                             type = c(rep("test", length(test_error_m308)),
                                      rep("train", length(train_error_m308))
                             ))



error_df_m10_02 <- data.frame(iter = c(seq_along(test_error_m1002),
                                      seq_along(train_error_m1002)),
                             Error = c(test_error_m1002, train_error_m1002), 
                             type = c(rep("test", length(test_error_m1002)),
                                      rep("train", length(train_error_m1002))
                             ))


error_df_m10_08 <- data.frame(iter = c(seq_along(test_error_m1008),
                                      seq_along(train_error_m1008)),
                             Error = c(test_error_m1008, train_error_m1008), 
                             type = c(rep("test", length(test_error_m1008)),
                                      rep("train", length(train_error_m1008))
                             ))



error_df_m20_02 <- data.frame(iter = c(seq_along(test_error_m2002),
                                       seq_along(train_error_m2002)),
                              Error = c(test_error_m2002, train_error_m2002), 
                              type = c(rep("test", length(test_error_m2002)),
                                       rep("train", length(train_error_m2002))
                              ))


error_df_m20_08 <- data.frame(iter = c(seq_along(test_error_m2008),
                                       seq_along(train_error_m2008)),
                              Error = c(test_error_m2008, train_error_m2008), 
                              type = c(rep("test", length(test_error_m2008)),
                                       rep("train", length(train_error_m2008))
                              ))



error_df_m50_02 <- data.frame(iter = c(seq_along(test_error_m5002),
                                       seq_along(train_error_m5002)),
                              Error = c(test_error_m5002, train_error_m5002), 
                              type = c(rep("test", length(test_error_m5002)),
                                       rep("train", length(train_error_m5002))
                              ))


error_df_m50_08 <- data.frame(iter = c(seq_along(test_error_m5008),
                                       seq_along(train_error_m5008)),
                              Error = c(test_error_m5008, train_error_m5008), 
                              type = c(rep("test", length(test_error_m5008)),
                                       rep("train", length(train_error_m5008))
                              ))


plot3_02 <- ggplot(error_df_m3_02[c(5000:10000, 15000:20000),], 
       aes(iter, Error, color = type, 
           each = length(test_error_m302))) + geom_line() + ggtitle("Error Model 3 Neurons 02 Learning Rate")

plot3_08 <- ggplot(error_df_m3_08[c(5000:10000, 15000:20000),], 
       aes(iter, Error, color = type, 
           each = length(test_error_m308))) + geom_line() + ggtitle("Error Model 3 Neurons 08 Learning Rate")

plot10_02 <- ggplot(error_df_m10_02[c(5000:10000, 15000:20000),], 
       aes(iter, Error, color = type, 
           each = length(test_error_m1002))) + geom_line() + ggtitle("Error Model 10 Neurons 02 Learning Rate")

plot10_08 <- ggplot(error_df_m10_08[c(5000:10000, 15000:20000),], 
       aes(iter, Error, color = type, 
           each = length(test_error_m1008))) + geom_line() + ggtitle("Error Model 10 Neurons 08 Learning Rate")

plot20_02 <- ggplot(error_df_m20_08[c(5000:10000, 15000:20000),], 
       aes(iter, Error, color = type, 
           each = length(test_error_m2002))) + geom_line() + ggtitle("Error Model 20 Neurons 02 Learning Rate")

plot20_08 <- ggplot(error_df_m20_08[c(5000:10000, 15000:20000),], 
       aes(iter, Error, color = type, 
           each = length(test_error_m2008)))  + geom_line() + ggtitle("Error Model 20 Neurons 08 Learning Rate")

plot50_02 <- ggplot(error_df_m50_02[c(5000:10000, 15000:20000),], 
       aes(iter, Error, color = type, 
           each = length(test_error_m2002))) + geom_line() + ggtitle("Error Model 50 Neurons 02 Learning Rate")

plot50_08 <- ggplot(error_df_m50_08[c(5000:10000, 15000:20000),], 
       aes(iter, Error, color = type, 
           each = length(test_error_m2008)))  + geom_line() + ggtitle("Error Model 50 Neurons 08 Learning Rate")

plot_grid("ANN Models with 02 Learning Rate", plot3_02, plot10_02, plot20_02, plot50_02, labels = c("N3", "N10", "N20", "N50"), ncol = 2, nrow = 2)

plot_grid("ANN Models with 08 Learning Rate", plot3_08, plot10_08, plot20_08, plot50_08, labels = c("N3", "N10", "N20", "N50"), ncol = 2, nrow = 2)

这是数据和数据框:

> head(data, 10)
       PatientID     radius    texture   perimeter
 [1,] -0.2361973  1.0960995 -2.0715123  1.26881726
 [2,] -0.2361956  1.8282120 -0.3533215  1.68447255
 [3,]  0.4313615  1.5784992  0.4557859  1.56512598
 [4,]  0.4317407 -0.7682333  0.2535091 -0.59216612
 [5,]  0.4318215  1.7487579 -1.1508038  1.77501133
 [6,] -0.2361855 -0.4759559 -0.8346009 -0.38680772
 [7,] -0.2361809  1.1698783  0.1605082  1.13712450
 [8,]  0.4326197 -0.1184126  0.3581350 -0.07280278
 [9,] -0.2361759 -0.3198854  0.5883121 -0.18391855
[10,]  0.4329621 -0.4731182  1.1044669 -0.32919213

> head(error_df)     
  iter     Error type
1    1 6913.5938 test
2    2 2981.7415 test
3    3 1906.2921 test
4    4 1425.6680 test
5    5 1157.7373 test
6    6  988.3097 test

我尝试添加 title_theme 但它给出了错误 object 'title_theme1' not found:

title_theme1 <- ggdraw() +
draw_label("ANN Models with 02 Learning Rate", 
             fontfamily = theme_georgia()$text$family, 
             fontface = theme_georgia()$plot.title$face, x = 0.05, hjust = 0)
plot_grid(title_theme, gridded, ncol = 1, rel_heights = c(0.2, 1))

title_theme2 <- ggdraw() +
  draw_label("ANN Models with 08 Learning Rate", 
             fontfamily = theme_georgia()$text$family, 
             fontface = theme_georgia()$plot.title$face, x = 0.05, hjust = 0)
plot_grid(title_theme, gridded, ncol = 1, rel_heights = c(0.2, 1))


#plot_grid(plot3_02, plot10_02, plot20_02, plot50_02 + rremove("x.text"),
plot_grid(title_theme1, plot3_02, plot10_02, plot20_02, plot50_02, labels = c("N3", "N10", "N20", "N50"), ncol = 2, nrow = 2)
plot_grid(title_theme2, plot3_08, plot10_08, plot20_08, plot50_08, labels = c("N3", "N10", "N20", "N50"), ncol = 2, nrow = 2)

【问题讨论】:

我怀疑问题在于plot_grid() 期望将绘图列表作为第一个参数,例如从plot_grid("ANN Models with 02 Learning Rate", plot3_02, plot10_02, plot20_02, plot50_02, labels = c("N3", "N10", "N20", "N50"), ncol = 2, nrow = 2) 中删除“具有 02 学习率的 ANN 模型”,看看它是否能解决问题。 (请参阅***.com/questions/50973713/… 为您的情节添加标题/副标题) 谢谢!我会尝试重新运行它,但它总是需要很长时间才能运行 @jared_mamrot 我尝试使用 title_theme 但它不起作用,这就是链接堆栈帖子中的建议,我在最后更新了我的问题以显示附加组件加结果 【参考方案1】:

这是一个例子:

library(tidyverse)
library(palmerpenguins)
library(cowplot)

p1 <- penguins %>%
  na.omit() %>%
  ggplot(aes(x = bill_length_mm, y = body_mass_g)) +
  geom_point() +
  theme_bw(base_size = 14) +
  labs(x = "Bill Length (mm)",
       y = "Body Mass (g)")

p2 <- penguins %>%
  na.omit() %>%
  ggplot(aes(x = factor(species), y = body_mass_g)) +
  geom_boxplot(outlier.shape = NA) +
  geom_jitter(aes(color = species),
              show.legend = FALSE,
              width = 0.25,
              alpha = 0.4,
              size = 3) +
  theme_bw(base_size = 14) +
  labs(x = "Species",
       y = "Body Mass (g)")

p3 <- penguins %>%
  na.omit() %>%
  ggplot(aes(x = bill_depth_mm, y = body_mass_g)) +
  geom_hex(bins = 10, show.legend = FALSE) +
  scale_x_continuous(expand = c(0:1)) +
  scale_y_continuous(expand = c(0,2)) +
  labs(x = "Species",
       y = "Body Mass (g)") +
  theme_bw(base_size = 14) +
    theme(legend.position = "none")

p4 <- penguins %>%
  na.omit() %>%
  ggplot(aes(x = factor(sex), y = body_mass_g)) +
  geom_boxplot(outlier.shape = NA) +
  geom_jitter(aes(color = sex),
              width = 0.25,
              alpha = 0.4,
              size = 3,
              show.legend = FALSE) +
  labs(x = "Sex",
       y = "Body Mass (g)") +
  theme_bw(base_size = 14)

plot_grid("title", p1, p2, p3, p4, labels = "AUTO", label_size = 16)
#> Warning in as_grob.default(plot): Cannot convert object of class character into
#> a grob.

plot_grid(p1, p2, p3, p4, labels = "AUTO", label_size = 16)

plots <- plot_grid(p1, p2, p3, p4, labels = "AUTO", label_size = 16)
title <- ggplot() + 
  labs(title = "ANN Models with 02 Learning Rate",
       subtitle = "Subtitle here") +
  theme_minimal()
plot_grid(title, plots, ncol = 1, rel_heights = c(0.1, 0.9))


title_theme1 <- ggdraw() +
  draw_label("ANN Models with 02 Learning Rate", 
             fontfamily = theme_bw()$text$family, 
             fontface = theme_bw()$plot.title$face,
             x = 0.05, hjust = 0)
plot_grid(title_theme1, plots, ncol = 1, rel_heights = c(0.1, 0.9))

由reprex package (v2.0.1) 于 2021 年 11 月 25 日创建

这能解决您的问题吗?

【讨论】:

以上是关于我在 R 中使用 cowplot 和 ggplot2 的 plot_grids 缺少网格中的四个图之一?的主要内容,如果未能解决你的问题,请参考以下文章

R语言使用cowplot包的plot_grid函数将两个ggplot2可视化结果并排组合起来并添加图像标签AB设置组合图像使用共享的图例(shared legend in cowplot)

将刻面ggplots(facet_wrap)与R中的cowplot对齐

ggplot2 vs cowplot,FUN 中的错误(“text”[[1L]],...):

如何将普通的ggplot与cowplot中的多面对齐?

将共享图例对齐到绘图网格的中心(使用cowplot)

禁用ggplots的cowplot默认值