如何创建多个x~y图表以显示不同的(x)和(y)变量?

3

我的数据长这样

data <- structure(list(code = 1:12, outcome1 = c(75L, 76L, 77L, 78L, 
80L, 82L, 85L, 84L, 78L, 84L, 84L, 75L), outcome2 = c(50L, 55L, 
54L, 52L, 56L, 58L, 59L, 54L, 52L, 56L, 56L, 57L), response1 = c(1500L, 
1800L, 1789L, 1200L, 1400L, 1900L, 1800L, 1100L, 1450L, 1750L, 
1770L, 1000L), response2 = c(100L, 111L, 120L, 140L, 144L, 156L, 
147L, 189L, 165L, 154L, 132L, 171L)), class = "data.frame", row.names = c(NA, 
-12L))

我有8个结果变量和22个响应变量。

我想为所有的结果变量和响应变量组合创建一系列回归图。有没有快速简便的方法?

例如:结果1 * 响应1、结果1 * 响应2、结果2 * 响应1等等。

这是创建一个结果1与响应1图形的示例代码。

ggplot(data = data, aes(x = outcome1, y = response1)) + 
  geom_point(color='blue') +
  geom_smooth(method = "lm", se = FALSE)

编辑:我考虑过分面,但是在这里可能不起作用,因为对于每个结果(x),各种响应(y)都是以不同的单位表示的。因此,不同(y)之间的y轴比例尺是不可比较的。

1个回答

4

在将数据输入到ggplot之前,始终将其转换为长格式。然后我们可以使用facet_grid创建图表:

library(ggplot2)
library(dplyr)
library(tidyr)

data %>%
  gather(var1, value1, outcome1:outcome2) %>%
  gather(var2, value2, response1:response2) %>%
  ggplot(aes(x = value1, y = value2)) + 
  geom_point(color='blue') +
  geom_smooth(method = "lm", se = FALSE) +
  facet_grid(var2 ~ var1, scales = "free", switch = "both",
             labeller = as_labeller(c(response1 = "response1 (mm)",
                          response2 = "response2 (kg)",
                          outcome1 = "outcome1 (index)",
                          outcome2 = "outcome2 (index)"))) +
  labs(title = "Regression Plot Matrix", x = NULL, y = NULL) +
  theme_bw() +
  theme(strip.placement = "outside",
        strip.background = element_blank())

注意:

  1. 由于变量可能具有不同的比例,因此我们在facet_grid中使用scale = "free",使每个轴自由缩放。

  2. switch = "both"将分面条标签更改为另一侧

  3. labeller允许我们提供一个命名向量,并根据需要更改条形标签

  4. strip.placement = "outside"将条形标签设置在轴刻度之外,而strip.background = element_blank()删除了灰色条形标签背景(受这个答案的启发,作者是aosmith)

  5. labs(..., x = NULL, y = NULL)去除默认轴标签,有效地将修改后的分面条标签视为轴标签

输出:

> data %>%
+   gather(var1, value1, outcome1:outcome2) %>%
+   gather(var2, value2, response1:response2)

   code     var1 value1      var2 value2
1     1 outcome1     75 response1   1500
2     2 outcome1     76 response1   1800
3     3 outcome1     77 response1   1789
4     4 outcome1     78 response1   1200
5     5 outcome1     80 response1   1400
6     6 outcome1     82 response1   1900
7     7 outcome1     85 response1   1800
8     8 outcome1     84 response1   1100
9     9 outcome1     78 response1   1450
10   10 outcome1     84 response1   1750
11   11 outcome1     84 response1   1770
12   12 outcome1     75 response1   1000
13    1 outcome2     50 response1   1500
14    2 outcome2     55 response1   1800
...

enter image description here


谢谢!我忘了提到各种结果和响应的单位不同,因此分面可能在这里行不通。至于给定的Outcome1,每个响应(Response1、Response2等)的测量单位也是不同的(克、杯子、%等)。 - DiscoR
@Mitch 我不确定这个。4个结果响应以相同的单位(毫米)表示,其中一个是厘米、千克,其他是指数(例如:BMI)。响应变量以盎司为单位,有些以杯和茶匙为单位。 - DiscoR
请注意,我已经使用了 scale = "free",这允许每个图有不同的比例尺。如果每个图都有一个单独的轴标签来指示比例尺,是否会有帮助? - acylam
@avid_useR 谢谢!我刚刚打印了这个图表,注意到两件事情。a)它能工作,但分离坐标轴标签会更有帮助,b)我的图表网格非常大(21×22)。有没有什么方法可以分割图表?我应该通过选择不同的变量手动创建两个单独的图表吗? - DiscoR
@DiscoR:如果你想将你的图表分成多个页面,请参考这个答案 - Tung
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接