Как выделить линию, соединяющую группу в ggplot R? - PullRequest
1 голос
/ 10 февраля 2020

Я очень плохо знаком с R и хочу выделить определенные группы на моем графике, используя gghighlight. Например, я хочу выделить красным только группы 16 и 32, оставив остальные строки серым. Мой текущий код и вывод ниже. Кажется, я не могу выделить определенные c группы, я могу только добавить цвет ко всем линиям. Я попытался gghighlight(grp==16), чтобы попытаться выделить 16, но он говорит: «Попытался вычислить с помощью group_by(), но вычисление не удалось».

example data

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"))

enter image description here

1 Ответ

0 голосов
/ 10 февраля 2020

Я пытался следовать вашему пути и сделал следующее. Я не знаком с gghighlight(). Я бросил быстрый взгляд и подумал, что вам нужно будет использовать логические проверки для выделения определенных групп. Если вы можете настроить логические проверки, я думаю, вы можете использовать функцию. В своем вопросе вы просто упомянули, что хотите выделить определенные c группы. Один из способов, которым вы можете воспользоваться, - назначить цвета с помощью scale_color_identity(). Я создал образец данных ниже. Я в основном назначил red трем группам (т.е. 1, 3, 5) в mutate(). Другие группы получили 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"))

enter image description here

Потенциальное решение с gghighlight

У меня нет ваших данных. Так что эта идея может / не может работать. Но у меня возникла следующая идея. Я изменил 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"))

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...