Search code examples
rggplot2geom-segment

Adjust yend in geom_segment when x is categorical


I would like to adjust the vertical position of the geom_segment when x is categorical. In the example below the geom_segment is centered around the variable on the x-axis.

I would like draw the segment starting on the line of the x-axis variable and extending towards above. I tried something like yend = variable + 1 which obvisouly does not work.

The question is somewhat similar to this question regarding geom_vline with categorical axis. However, I think something like yintercept = ... would not work in my case.

library(tidyverse)

mydata = data.frame(variable = factor(c("A","A","A","B","C")),
                    color = factor(c(1,2,3,4,5)),
                    start = c(1,2,1,4,6),
                    end = c(3,4,6,5,8))

ggplot(mydata, aes(x = start, xend = end, y = variable, yend = variable)) + 
  geom_segment(aes(color = color), size = 10)

Created on 2022-04-28 by the reprex package (v2.0.1)

The reason I ask is because in my real data I add a histogram to each x-variable (with ggridges::geom_density_ridges) which starts on the line of the x-axis variable. The plot looks strange if geom_segment and geom_density_ridges do not lie on the same level.


Solution

  • Maybe you can use geom_rect instead.

    library(ggplot2)
    mydata = data.frame(variable = factor(c("A","A","A","B","C")),
                        color = factor(c(1,2,3,4,5)),
                        start = c(1,2,1,4,6),
                        end = c(3,4,6,5,8))
    
    ggplot(mydata) + 
      geom_rect(aes(xmin = start, xmax = end, 
                    ymin = variable, ymax = as.numeric(variable) + 0.2, 
                    fill = color))
    

    Created on 2022-04-28 by the reprex package (v2.0.1)