ggplot2 - рисование линии между двумя переменными y рядом друг с другом для каждого из трех x (с двумя цветовыми категориями) - PullRequest
1 голос
/ 25 апреля 2019

У меня есть некоторые данные, которые выглядят так

 X  A      y   ysd   yse     y2  ysd2  yse2

40  1   46.1  21.2  2.48   42.8  20.1  2.35
40  2   36.6  20.6  2.28   39.9  22.0  2.43
60  1   61.7  25.3  2.87   61.5  23.9  2.71
60  2   53.7  20.9  2.23   52.4  20.8  2.22
80  1   58.7  33.5  3.68   63.2  30.9  3.40
80  2   62.5  29.7  3.18   70.5  20.7  2.21

Я пытаюсь построить y и y2 рядом друг с другом, связанные линией, для каждого X (с вертикальными линиями +/- SE и цветовой переменной A). Я прочесал похожие вопросы, но не смог найти ничего, что могло бы помочь. Самое близкое, что я получил, это подтолкнул вторую переменную вправо, но она выглядит неаккуратно (метки оси X), и я не могу понять, как связать переменные с линией.

ggplot(a, aes(x=X, color=A)) + 
  geom_pointrange(aes(y=y, ymin=y-yse, ymax=y+yse)) + 
  geom_pointrange(aes(y=y2, ymin=y2-yse2, ymax=y2+yse2), position=position_nudge(x=5))

Вот картинка, которую я получаю (метки немного смещены, поскольку мои переменные в реальном наборе данных имеют разные названия):

enter image description here

Я, по сути, пытаюсь получить что-то похожее на картинку (но менее небрежную), где две точки каждого цвета в каждой секции (X = 40, 60, 80) соединены линией. Спасибо!

1 Ответ

0 голосов
/ 25 апреля 2019

Редактировать: добавлен 2-й подход.

Вы можете добавить отрезок строки и указать xend для сдвига 5:

ggplot(a, aes(x=X, color=A)) + 
  geom_pointrange(aes(y=y, ymin=y-yse, ymax=y+yse)) + 
  geom_pointrange(aes(y=y2, ymin=y2-yse2, ymax=y2+yse2), position=position_nudge(x=5)) +
  geom_segment(aes(xend = X+5, y = y, yend = y2))

enter image description here


Или другой подход - сначала увеличить длину таблицы:

a %>%
  gather(col, val, -c(X,A)) %>%
  mutate(class = if_else(col %>% str_detect("2"), 2, 1),
         col = col %>% str_remove("2")) %>%
  spread(col, val) %>%
  mutate(adj_X = X + if_else(class == 1, -1, 1) * 2) %>%

ggplot(aes(x=adj_X, color=A)) +
  geom_pointrange(aes(y=y, ymin = y - yse, ymax = y + yse)) +
  geom_path(aes(group = interaction(X, A), y = y))

enter image description here

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