【发布时间】:2019-07-21 12:52:39
【问题描述】:
我正在尝试使用 R 和 ggplot2 包绘制 18 个图形。我的数据如下所示:
v1 v2 v3 ... v18 subject group
534 543 512 ... 410 1 (6.5, 18]
437 576 465 ... 420 2 (0, 6.5]
466 487 492 ... 501 3 (18, 55]
我需要创建一个“分面”直方图,显示一帧中所有组的分布(即方便地显示所有子组的分布),如下所示:
我为一个情节想出了这段代码:
ggplot(data = df, aes (x = v1)) + geom_histogram (boundary = 500) + facet_wrap(~Group, nrow = 2)
但由于有 18 个变量(v1、v2、...),我正在寻找一种方法来编写一个高效的函数/循环/命令来绘制所有 18 个图形,而无需我复制/粘贴和更改变量名 18 次。像这样:
ggplot(data = df, aes (x = **v1**)) + geom_histogram (boundary = 500) + facet_wrap(~Group, nrow = 2)
ggplot(data = df, aes (x = **v2**)) + geom_histogram (boundary = 500) + facet_wrap(~Group, nrow = 2)
ggplot(data = df, aes (x = **v3**)) + geom_histogram (boundary = 500) + facet_wrap(~Group, nrow = 2)
我知道解决方案可能在于循环,它似乎是一项有用的技能,所以我也借此机会学习这个权利。
谢谢,感谢您的帮助! (感谢迄今为止的所有建议!)
在以下用户的善意帮助下,到目前为止,这是我所取得的成就:
for (v in c(v1,v2)) {
pdf("plots.pdf")
histograms <- ggplot(data = data, aes (x = v)) + geom_histogram (boundary = 500) + facet_wrap(~Group, nrow = 2)
print(histograms)
}
dev.off()
【问题讨论】:
-
打开一个输出连接,例如
pdf。然后在for循环中运行代码。在循环结束时,仍在循环内,添加行print(histograms)以将图形输出到 pdf。在循环下方,添加行dev.off()以关闭 pdf 连接。 -
我运行起来了,谢谢!现在只有打印很糟糕——它只有一页打印了一个 ggplots。而且它们看起来不像直方图。
-
Petr,您的问题可以通过提供更多详细信息和(有限)数据示例来改进。我猜到了您的要求,并提供了一些建议的答案。祝你好运。
-
太棒了!我猜数据集太复杂了。这是一种将名为
wide的data.frame 中的数据转换为长格式的简单方法(假设唯一的名称是'v1'、'v2'、...和'group')。新数据应该在我提供的答案中起作用。sel <- which(names(wide) == "group"); dat <- stack(wide[-sel]); names(dat) <- c("v", "Group") -
我现在看到您的数据似乎有两个级别的分组。第一个由名为“v1”、“v2”和“v3”的变量定义。第二个是通过切割名称似乎是从
cut()函数生成的值生成的变量:(0, 6.50], (6.5, 18], (18, 55] 等。后一组似乎是在您的原始问题中命名为Group的变量。同样,使用有关您的数据的信息提出解决方案会更容易。我稍后会回来看看我们是否可以再做一次!:)