r - ggplot2 长格式数据散点图,具有未知/可变站点名称
问题描述
我正在尝试制作散点图,它比较以长格式输入的不同站点的值。
我可以使用固定的站点名称轻松地做到这一点,但我希望能够在输入数据中使用不同的站点名称运行它。目前脚本将数据转换为宽格式然后绘制它们,但这意味着我必须手动更改站点名称。
最初我很高兴当我在输入数据中有 2 个站点时它只工作,但如果它有 3 个站点用于制作所有站点组合并将它们组合起来类似于我在下面所做的那样,我会很高兴。
ggplot 中是否有任何功能可以从长数据框中创建散点图?
我在 ggplot 中发现了一个类似的问题Scatter plot,一个跨两组的数字变量,但它的答案基本上是我的起点,但它没有相关名称可能改变的问题。
下面的代码给了我我想要的东西,但是如果我改变了输入数据(例如,将站点更改为rep(letters[4:6],each = 10)
它将变得无用。
library(tidyverse)
set.seed(2)
testdf <- tibble(Site = rep(letters[1:3], each = 10), x = rep(1:10,3), y = rnorm(30, mean = 1, sd = 0.05)*x)
testdf_w <- pivot_wider(testdf, names_from = Site, values_from = y)
p1 <- ggplot(testdf_w, aes(x = a, y = b))+
geom_point()
p1 # This is all I'd need if there were only 2 sites
library(patchwork)
#> Warning: package 'patchwork' was built under R version 3.5.3
p2 <- ggplot(testdf_w, aes(x = a, y = c))+
geom_point()
p3 <- ggplot(testdf_w, aes(x = b, y = c))+
geom_point()
p1 + p2 + p3
由reprex 包于 2020-03-12 创建(v0.3.0)
解决方案
您可以遍历唯一站点名称的组合,并使用aes_string
将列名称指定为字符串。
library(tidyverse)
set.seed(2)
testdf <- tibble(Site = rep(letters[1:3], each = 10),
x = rep(1:10,3),
y = rnorm(30, mean = 1, sd = 0.05)*x)
testdf_w <- pivot_wider(testdf, names_from = Site, values_from = y)
library(patchwork)
sites <- unique(testdf$Site)
p <- NULL
for (s1 in sites) {
for (s2 in sites) {
if (s1 >= s2) next
tmp <- ggplot(testdf_w, aes_string(x = s1, y = s2)) +
geom_point()
if (is.null(p)) {
p <- tmp
} else {
p <- p + tmp
}
}
}
p
此外,您可能还喜欢ggpairs
这个特定的应用程序。
library(GGally)
ggpairs(select(testdf_w, -x))