How to jitter both geom_line and geom_point by the same magnitude?

前端 未结 3 1007
刺人心
刺人心 2020-12-10 12:30

I have a ggplot2 linegraph with two lines featuring significant overlap. I\'m trying to use position_jitterdodge() so that they are more visible, b

相关标签:
3条回答
  • 2020-12-10 13:11

    Another option for horizontal only would be to specify position_dodge and pass this to the position argument for each geom.

    pd <- position_dodge(0.4)
    
    ggplot(data = df, aes(x = dimension, y = value,
                          shape = Time, linetype = Time, group = Time)) +
      geom_line(position = pd) +
      geom_point(position = pd) +
      xlab("Dimension") + ylab("Value")
    

    0 讨论(0)
  • 2020-12-10 13:22

    One solution is to manually jitter the points:

    df$value_j <- jitter(df$value)
    
    ggplot(df, aes(dimension, value_j, shape=Time, linetype=Time, group=Time)) +
      geom_line() +
      geom_point() +
      labs(x="Dimension", y="Value")
    

    The horizontal solution for your discrete X axis isn't as clean (it's clean under the covers when ggplot2 does it since it handles the axis and point transformations for you quite nicely) but it's doable:

    df$dim_j <- jitter(as.numeric(factor(df$dimension)))
    
    ggplot(df, aes(dim_j, value, shape=Time, linetype=Time, group=Time)) +
      geom_line() +
      geom_point() +
      scale_x_continuous(labels=dimension) +
      labs(x="Dimension", y="Value")
    

    0 讨论(0)
  • 2020-12-10 13:22

    On July 2017, developpers of ggplot2 have added a seed argument on position_jitter function (https://github.com/tidyverse/ggplot2/pull/1996).

    So, now (here: ggplot2 3.2.1) you can pass the argument seed to position_jitter in order to have the same jitter effect in geom_point and geom_line (see the official documentation: https://ggplot2.tidyverse.org/reference/position_jitter.html)

    Note that this seed argument does not exist (yet) in geom_jitter.

    ggplot(data = df, aes(x = dimension, y = value,
                          shape = Time, linetype = Time, group = Time)) +
      geom_line(position = position_jitter(width = 0.25, seed = 123)) +
      geom_point(position = position_jitter(width = 0.25, seed = 123)) +
      xlab("Dimension") + ylab("Value")
    

    0 讨论(0)
提交回复
热议问题