首页 > 解决方案 > 使用只有一个变量的 ggplot2 在 R 中绘制小​​平面网格

问题描述

我有一个名为 mouse.data 的数据框,它有 3 列:特征值、双特征值和实验。这个问题不涉及 DualEigenvalues 数据,所以可以忘记。

我们进行了 5 个实验,并使用每个实验的数据来计算 14 个特征值。所以这个数据框的前 14 行是第一个实验的 14 个特征值,实验条目的值为 1,后 14 行是第二个实验的 14 个特征值,实验条目的值为 2,依此类推。

然后,我将每个成对实验的特征值相互绘制,这是此代码的示例:

eigen.1 <- mouse.data$Eigenvalues[mouse.data$Experiment == 1]
eigen.2 <- mouse.data$Eigenvalues[mouse.data$Experiment == 2]
p.data <- data.frame(x = eigen.1, y = eigen.2)
ggplot(p.data, aes(x,y)) + geom_abline(slope = 1, colour = "red") + geom_point()

这给了我这样的图表:

绘图示例

这正是我希望这张图看起来的样子。

我想做但无法解决的问题是绘制 afacet_grid以便第 i 行和第 j 列中的图在 y 轴上绘制第 i 个实验的特征值和第 j 个实验的特征值x 轴。

这是迄今为止我最接近的,我希望这能让我的意思更清楚。

刻面示例

标签: rggplot2

解决方案


如果没有可重现的数据示例,这很棘手,但听起来我们可以大致近似数据框的结构,如下所示:

library(ggplot2)

set.seed(1)

Eigen <- as.vector(sapply(runif(5, .5, 1.5), 
                          function(x) sort(rgamma(14, 2, 0.02*x))))

mouse.data <- data.frame(Experiment = rep(seq(5), each = 14), Eigenvalue = Eigen)

head(mouse.data)
#>   Experiment Eigenvalue
#> 1          1   39.61451
#> 2          1   44.48163
#> 3          1   54.57964
#> 4          1   75.06725
#> 5          1   75.50014
#> 6          1   94.41255

使绘图工作的关键是将数据重塑为包含每个实验组合的长格式数据框。一种方法是通过split对数据帧进行处理Experiment,然后使用结果列表的简单索引(使用rep)来获取所有唯一的数据帧对。每个唯一对按列粘贴在一起,然后将得到的 25 个数据帧全部按行连接到绘图数据帧中。

experiments <- split(mouse.data, mouse.data$Experiment)

experiments <- mapply(cbind, 
                      experiments[rep(1:5, 5)], 
                      experiments[rep(1:5, each = 5)], 
                      SIMPLIFY = FALSE)

p.data <- do.call(rbind, lapply(experiments, setNames, 
                                nm = c("Experiment1", "x",
                                       "Experiment2", "y")))

完成此操作后,我们可以使用您的绘图代码,并添加一个facet_grid调用:

ggplot(p.data, aes(x,y)) + 
  geom_abline(slope = 1, colour = "red") + 
  geom_point() +
  facet_grid(Experiment1~Experiment2)

在此处输入图像描述


推荐阅读