如何在组内连接ggplot中的分组点?
How to connect grouped points in ggplot within groups?
我有一个包含两组的数据集 - 实验组和控制组。每个参与者为每组贡献两个响应,代表不同的学习方式。这些在下面带有抖动的箱形图中表示。我想使用 ggplot 将每个参与者的两个响应与线连接在一起(因此控制组中的每条红线将对应于控制组中的每条绿松石线),但是我无法弄清楚如何在条件下执行此操作。有人可以帮忙吗?我是 R 的新手,真的需要指导。
然后,如果 Increase = TRUE,我需要将条件内线条的颜色更改为黑色,如果 Increase = FALSE,则更改为红色。
理想情况下,我需要它看起来像 Jon 此处的示例,但带有基于 True 或 False 的黑色或红色线条:
数据和 ggplot 如下所示:
d <- data.frame (
Subject = c("1", "2", "3", "4"),
Group = c("Exp", "Exp", "Control", "Control"),
Tr = c("14", "11", "4", "23"),
Sr = c("56", "78", "12", "10"),
Increase = c("TRUE", "TRUE", "TRUE", "FALSE")
)
# put the data in long format
d <- d %>%
gather(key = "Strategy", value = "raw", Tr, Sr)
d %>%
ggplot(aes(x = Group, y = raw, color = Strategy)) +
geom_boxplot(width = 0.5, lwd = 0.5) +
geom_jitter(width = 0.15) +
geom_line(aes(group = raw),
color = "grey",
arrow = arrow(type = "closed",
length = unit(0.075, "inches")))
灵感来自您链接到的答案 -
理解解决方案有几个关键点
- 由于您需要连接点和线,因此您需要它们都应用完全相同的随机抖动,或者最好在数据进入绘图之前抖动数据,这就是我所做的。
- 由于应用抖动的变量不是数字,注意 R 将字符向量
Group
绘制为一个因子,解释为数字 1,2,3,.. 对应于因素水平。因此,我们创建了一个数值向量 group_jit,其值在 1 和 2 左右,偏移量基于着色变量 Strategy
,在 1 和 2 左右略微左右移动。
- 由于您有两个独立的色标,最好将组表示为
fill
,将线表示为 colour
,以避免单个图例包含 4 个东西。
这是代码 -
library(tidyverse)
# Load data
d <- data.frame (
Subject = c("1", "2", "3", "4"),
Group = c("Exp", "Exp", "Control", "Control"),
Tr = c("14", "11", "4", "23"),
Sr = c("56", "78", "12", "10"),
Increase = c("TRUE", "TRUE", "TRUE", "FALSE")
)
width_jitter <- 0.2 # 1 means full width between points
# put the data in long format
d_jit <- d %>%
gather(key = "Strategy", value = "raw", Tr, Sr) %>%
# type conversions
mutate(across(c(Group, Strategy), as_factor)) %>% # convert to factors
mutate(raw = as.numeric(raw)) %>% # make raw as numbers
# position on x axis is based on combination of Group and jittered Strategy. Mix to taste.
mutate(group_jit = as.numeric(Group) + jitter(as.numeric(Strategy) - 1.5) * width_jitter * 2,
grouping = interaction(Subject, Strategy))
# plotting
d_jit %>%
ggplot(aes(x = Group, y = raw, fill = Strategy)) +
geom_boxplot(width = 0.5, lwd = 0.5, alpha = 0.05, show.legend = FALSE) +
geom_point(aes(x = group_jit), size = 3, shape = 21) +
geom_line(aes(x = group_jit,
group = Subject,
colour = Increase),
alpha = 0.5,
arrow = arrow(type = "closed",
length = unit(0.075, "inches"))
) +
scale_colour_manual(values = c('red', 'black'))
由 reprex package (v2.0.1)
于 2022-05-14 创建
为了完整起见,一种不同的、更优雅的抖动方法是为 geom_point
和 geom_line
命令提供一个 position
参数,一个函数添加了像这样的随机抖动(来源:)
position = ggplot2::position_jitterdodge(dodge.width = 0.75, jitter.width = 0.3, seed = 1)
这样数据本身不会改变,绘图会处理抖动细节
jitterdodge
做闪避(x 轴变量的移动)和抖动(彩色点的小噪声)
- 此处的
seed
参数是关键,因为它确保为独立调用它的点和线函数返回相同的 random 值
我有一个包含两组的数据集 - 实验组和控制组。每个参与者为每组贡献两个响应,代表不同的学习方式。这些在下面带有抖动的箱形图中表示。我想使用 ggplot 将每个参与者的两个响应与线连接在一起(因此控制组中的每条红线将对应于控制组中的每条绿松石线),但是我无法弄清楚如何在条件下执行此操作。有人可以帮忙吗?我是 R 的新手,真的需要指导。
然后,如果 Increase = TRUE,我需要将条件内线条的颜色更改为黑色,如果 Increase = FALSE,则更改为红色。
理想情况下,我需要它看起来像 Jon 此处的示例,但带有基于 True 或 False 的黑色或红色线条:
数据和 ggplot 如下所示:
d <- data.frame (
Subject = c("1", "2", "3", "4"),
Group = c("Exp", "Exp", "Control", "Control"),
Tr = c("14", "11", "4", "23"),
Sr = c("56", "78", "12", "10"),
Increase = c("TRUE", "TRUE", "TRUE", "FALSE")
)
# put the data in long format
d <- d %>%
gather(key = "Strategy", value = "raw", Tr, Sr)
d %>%
ggplot(aes(x = Group, y = raw, color = Strategy)) +
geom_boxplot(width = 0.5, lwd = 0.5) +
geom_jitter(width = 0.15) +
geom_line(aes(group = raw),
color = "grey",
arrow = arrow(type = "closed",
length = unit(0.075, "inches")))
灵感来自您链接到的答案 -
理解解决方案有几个关键点
- 由于您需要连接点和线,因此您需要它们都应用完全相同的随机抖动,或者最好在数据进入绘图之前抖动数据,这就是我所做的。
- 由于应用抖动的变量不是数字,注意 R 将字符向量
Group
绘制为一个因子,解释为数字 1,2,3,.. 对应于因素水平。因此,我们创建了一个数值向量 group_jit,其值在 1 和 2 左右,偏移量基于着色变量Strategy
,在 1 和 2 左右略微左右移动。 - 由于您有两个独立的色标,最好将组表示为
fill
,将线表示为colour
,以避免单个图例包含 4 个东西。
这是代码 -
library(tidyverse)
# Load data
d <- data.frame (
Subject = c("1", "2", "3", "4"),
Group = c("Exp", "Exp", "Control", "Control"),
Tr = c("14", "11", "4", "23"),
Sr = c("56", "78", "12", "10"),
Increase = c("TRUE", "TRUE", "TRUE", "FALSE")
)
width_jitter <- 0.2 # 1 means full width between points
# put the data in long format
d_jit <- d %>%
gather(key = "Strategy", value = "raw", Tr, Sr) %>%
# type conversions
mutate(across(c(Group, Strategy), as_factor)) %>% # convert to factors
mutate(raw = as.numeric(raw)) %>% # make raw as numbers
# position on x axis is based on combination of Group and jittered Strategy. Mix to taste.
mutate(group_jit = as.numeric(Group) + jitter(as.numeric(Strategy) - 1.5) * width_jitter * 2,
grouping = interaction(Subject, Strategy))
# plotting
d_jit %>%
ggplot(aes(x = Group, y = raw, fill = Strategy)) +
geom_boxplot(width = 0.5, lwd = 0.5, alpha = 0.05, show.legend = FALSE) +
geom_point(aes(x = group_jit), size = 3, shape = 21) +
geom_line(aes(x = group_jit,
group = Subject,
colour = Increase),
alpha = 0.5,
arrow = arrow(type = "closed",
length = unit(0.075, "inches"))
) +
scale_colour_manual(values = c('red', 'black'))
由 reprex package (v2.0.1)
于 2022-05-14 创建为了完整起见,一种不同的、更优雅的抖动方法是为 geom_point
和 geom_line
命令提供一个 position
参数,一个函数添加了像这样的随机抖动(来源:
position = ggplot2::position_jitterdodge(dodge.width = 0.75, jitter.width = 0.3, seed = 1)
这样数据本身不会改变,绘图会处理抖动细节
jitterdodge
做闪避(x 轴变量的移动)和抖动(彩色点的小噪声)- 此处的
seed
参数是关键,因为它确保为独立调用它的点和线函数返回相同的 random 值