r - 使用只有一个变量的 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 轴。
这是迄今为止我最接近的,我希望这能让我的意思更清楚。
解决方案
如果没有可重现的数据示例,这很棘手,但听起来我们可以大致近似数据框的结构,如下所示:
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)
推荐阅读
- postgresql - 无法在 postgresql 中添加检查约束
- python - 在 python 中从 SwaggerAPI 自动生成服务框架
- javascript - 有没有办法将多个div组合成一个
- c# - 如何使用最小起订量 ApplicationUser、ApplicationContextdb、IEmailSender 和 IConfirguration 编写测试用例
- ruby - Ruby:为什么第二段代码与第一段代码相似 - 给出“未定义方法”错误?
- r - 使用 doi 从论文中检索参考文献
- c++ - 排除外部错误 R6025 - 纯虚函数调用
- reporting-services - 获取从数据集列 ssrs 之间的值
- c# - 我不明白为什么我有 null MVC AJAX
- python - 如何使用python从父标签中获取数据