Постройте несколько сегментов с частично общей легендой - PullRequest
0 голосов
/ 28 января 2020

Скажите, что у меня есть следующий фрейм данных:

line_df <- data.frame(x_ini = c(0.55,2.55,1.55,5.55,7.55),
x_end = c(1.45,3.45,2.45,6.45,8.45),
y = c(-0.5,-0.5,-1.5,-2.5,-2.5),
category = c("red","red","blue","green","green"))

Я хочу построить горизонтальный сегмент для каждой строки фрейма данных. Сегменты линий будут определены следующим образом: (x_ini[i],y[i]) и (x_end[i],y[i]), а цвет сегментов: line_df$category.

Я пробовал с geom_segment, segments, abline и lines но мне не удается правильно установить легенду и построить сегменты с помощью тех же инструкций, потому что у меня есть другие данные, которые я хочу включить в тот же график.

Есть предложения о том, как я могу это сделать? Рад изменить фрейм данных на другую, более подходящую структуру, но я хочу избежать вызова одной и той же инструкции несколько раз для каждого из сегментов.

Спасибо!

РЕДАКТИРОВАТЬ

Другие данные, которые я хочу включить, приведены ниже.

previous_df <- data.frame(letter=c("x","y","y","z","x","p"),number=c(9,3,2,1,5,7),labeldf=c(1,15,12,15,1,12))

ggplot(previous_df,aes(labeldf,number,fill=letter)) +
    geom_bar(stat="identity",position='dodge')

Таким образом, проблема в том, что я не могу добавить еще один слой ggplot к нему, и если я добавляю непосредственно geom_segment (упомянутый в ответе Nova), я получаю ошибки относительно fill вариант.

1 Ответ

2 голосов
/ 28 января 2020

Я думаю, что если вы добавите поле для строки, вы сможете это сделать - это то, что вы имеете в виду?

line_df$row <- seq_len(nrow(line_df))

ggplot(line_df) +
  geom_segment(aes(x = x_ini, xend = x_end, y = y, yend = y, 
                   group = row, color = category), size = 2) +
  scale_color_manual(values = c("lightblue", "seagreen", "firebrick"))

enter image description here

Если Вы хотите добавить данные из другого фрейма данных, вы можете сделать это следующим образом:

ggplot(previous_df) +
  geom_bar(aes(labeldf, number, fill=letter), stat="identity",position='dodge') +
  geom_segment(data = line_df, aes(x = x_ini, xend = x_end, y = y, yend = y, 
                                   group = row, color = category), size = 2) +
  scale_color_manual(values = c("lightblue", "seagreen", "firebrick"))

enter image description here

...