如何在 ggplot R 中突出显示连接组的线?
How to highlight a line connecting a group in ggplot R?
我是 R 的新手,我希望使用 gghighlight
在我的情节中突出显示某些组。例如,我想仅以红色突出显示第 16 组和第 32 组,而将其余行保留为灰色。我当前的代码和输出如下。我似乎无法突出显示特定的组,我只能为所有行添加颜色。我已经尝试 gghighlight(grp==16)
尝试突出显示 16 但它显示 "Tried to calculate with group_by()
, but the calculation failed".
library(readxl)
library(ggplot2)
library(gghighlight)
guidelines <- read_excel("data.xlsx", sheet=1)
guidelines$step <- factor(guidelines$step, levels=c("First", "Highest", "Final"))
map <- ggplot(guidelines,
aes(x = step, y = type, group = grp, color = factor(grp))) +
scale_color_hue(l=45) +
geom_line(linetype = 1) +
geom_line(position=position_jitter(w=0, h=0.05))
map + scale_y_continuous(breaks = c(1,2,3,4))
map + scale_y_continuous(breaks = c(1,2,3,4),
labels = c("Method 1", "Method 2", "Method 3", "Method 4"))
我试着按照你的方式做了以下事情。我不熟悉gghighlight()
。我快速浏览了一下,认为您需要使用逻辑检查来突出显示某些组。如果你可以设置逻辑检查,我想你可以使用该功能。在你的问题中,你只是提到你想突出特定的群体。您可以采用的一种方法是使用 scale_color_identity()
分配颜色。我在下面创建了一个示例数据。我基本上将 red
分配给 mutate()
中的三个组(即 1、3、5)。其他组在列中得到 gray50
,color
。
library(tidyverse)
guidelines <- tibble(step = rep(c("First", "Highest", "Final"), times = 5),
type = c(2, 4, 4, 2, 4, 4, 4, 4, 4, 2, 4, 2, 1, 3, 3),
grp = rep(1:5, each = 3))
mutate(guidelines,
step = factor(step, levels = c("First", "Highest", "Final")),
color = if_else(grp %in% c(1, 3, 5), "red", "gray50")) -> guidelines
ggplot(data = guidelines, aes(x = step, y = type, color = color, group = grp)) +
geom_line(linetype = 1, position = position_jitter(w = 0, h = 0.05)) +
scale_color_identity(guide = "legend", labels = c("Other groups", "Group 1, 3, 5")) +
scale_y_continuous(breaks = c(1,2,3,4),
labels = c("Method 1", "Method 2", "Method 3", "Method 4"))
使用 gghighlight 的潜在解决方案
我没有你的数据。所以这个想法may/may行不通。但是我想出了以下想法。我再次修改了guidelines
。我创建了一个新的连续变量(即虚拟变量),用于 x 轴。这有点扭曲,因为我们应该在轴上有一个分类变量。但是如果你想使用gghighlight
,这是必须的。据我了解 gghighlight
,我们需要在函数中进行逻辑检查。在这里,我想突出显示最大值为 3 的行。这突出显示了第 5 组。由于您想要两个分类变量,我们必须修改 x 和 y 轴上的名称。如果你能对数据中的两组(16和32)设置逻辑检查,我相信你可以使用这个想法。
library(gghighlight)
mutate(guidelines,
dummy = recode(.x = step, First = 1, Highest = 2, Final = 3),
step = factor(step, levels = c("First", "Highest", "Final")),
color = if_else(grp %in% c(1, 3, 5), "red", "gray50")) -> guidelines
ggplot(data = guidelines, aes(x = dummy, y = type, color = color, group = grp)) +
geom_line(size = 2, linetype = 1) +
gghighlight(max(as.numeric(type)) == 3, label_key = grp) +
labs(x = "Step", y = "Type") +
scale_x_continuous(breaks = c(1,2,3),
labels = c("First", "Highest", "Final")) +
scale_y_continuous(breaks = c(1,2,3,4),
labels = c("Method 1", "Method 2", "Method 3", "Method 4"))
我是 R 的新手,我希望使用 gghighlight
在我的情节中突出显示某些组。例如,我想仅以红色突出显示第 16 组和第 32 组,而将其余行保留为灰色。我当前的代码和输出如下。我似乎无法突出显示特定的组,我只能为所有行添加颜色。我已经尝试 gghighlight(grp==16)
尝试突出显示 16 但它显示 "Tried to calculate with group_by()
, but the calculation failed".
library(readxl)
library(ggplot2)
library(gghighlight)
guidelines <- read_excel("data.xlsx", sheet=1)
guidelines$step <- factor(guidelines$step, levels=c("First", "Highest", "Final"))
map <- ggplot(guidelines,
aes(x = step, y = type, group = grp, color = factor(grp))) +
scale_color_hue(l=45) +
geom_line(linetype = 1) +
geom_line(position=position_jitter(w=0, h=0.05))
map + scale_y_continuous(breaks = c(1,2,3,4))
map + scale_y_continuous(breaks = c(1,2,3,4),
labels = c("Method 1", "Method 2", "Method 3", "Method 4"))
我试着按照你的方式做了以下事情。我不熟悉gghighlight()
。我快速浏览了一下,认为您需要使用逻辑检查来突出显示某些组。如果你可以设置逻辑检查,我想你可以使用该功能。在你的问题中,你只是提到你想突出特定的群体。您可以采用的一种方法是使用 scale_color_identity()
分配颜色。我在下面创建了一个示例数据。我基本上将 red
分配给 mutate()
中的三个组(即 1、3、5)。其他组在列中得到 gray50
,color
。
library(tidyverse)
guidelines <- tibble(step = rep(c("First", "Highest", "Final"), times = 5),
type = c(2, 4, 4, 2, 4, 4, 4, 4, 4, 2, 4, 2, 1, 3, 3),
grp = rep(1:5, each = 3))
mutate(guidelines,
step = factor(step, levels = c("First", "Highest", "Final")),
color = if_else(grp %in% c(1, 3, 5), "red", "gray50")) -> guidelines
ggplot(data = guidelines, aes(x = step, y = type, color = color, group = grp)) +
geom_line(linetype = 1, position = position_jitter(w = 0, h = 0.05)) +
scale_color_identity(guide = "legend", labels = c("Other groups", "Group 1, 3, 5")) +
scale_y_continuous(breaks = c(1,2,3,4),
labels = c("Method 1", "Method 2", "Method 3", "Method 4"))
使用 gghighlight 的潜在解决方案
我没有你的数据。所以这个想法may/may行不通。但是我想出了以下想法。我再次修改了guidelines
。我创建了一个新的连续变量(即虚拟变量),用于 x 轴。这有点扭曲,因为我们应该在轴上有一个分类变量。但是如果你想使用gghighlight
,这是必须的。据我了解 gghighlight
,我们需要在函数中进行逻辑检查。在这里,我想突出显示最大值为 3 的行。这突出显示了第 5 组。由于您想要两个分类变量,我们必须修改 x 和 y 轴上的名称。如果你能对数据中的两组(16和32)设置逻辑检查,我相信你可以使用这个想法。
library(gghighlight)
mutate(guidelines,
dummy = recode(.x = step, First = 1, Highest = 2, Final = 3),
step = factor(step, levels = c("First", "Highest", "Final")),
color = if_else(grp %in% c(1, 3, 5), "red", "gray50")) -> guidelines
ggplot(data = guidelines, aes(x = dummy, y = type, color = color, group = grp)) +
geom_line(size = 2, linetype = 1) +
gghighlight(max(as.numeric(type)) == 3, label_key = grp) +
labs(x = "Step", y = "Type") +
scale_x_continuous(breaks = c(1,2,3),
labels = c("First", "Highest", "Final")) +
scale_y_continuous(breaks = c(1,2,3,4),
labels = c("Method 1", "Method 2", "Method 3", "Method 4"))