绘制具有部分通用图例的多个片段

Plot several segments with a partially common legend

假设我有以下数据框:

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_segmentsegmentsablinelines,但我无法正确设置图例并用相同的图例绘制线段说明,因为我还有其他数据要包含在同一图上。

关于如何执行此操作的任何建议?很高兴将数据框修改为其他更合适的结构,但我想避免为每个段多次调用相同的指令。

谢谢!

编辑

我想包括的其他数据如下。

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选项。

我认为如果您为 "row" 添加一个字段就可以做到 - 这是您的意思吗?

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

如果你想从另一个数据框中添加数据,你可以这样做:

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