使用带有geom_line的position_dodge

时间:2019-02-19 22:25:35

标签: r ggplot2

我的问题与此question密切相关,但是是后续行动,并非重复。我的绘图问题与将postion_dodge()geom_line()一起使用。

数据:

Behaviour Repeatability       UCI       LCI Age stage
Activity     0.1890000 0.2470000 0.1600000  PE     A
Activity     0.5500000 0.7100000 0.3900000  PW     B
Activity     0.5100000 0.6300000 0.4000000   A     D
Activity     0.4100000        NA        NA  A2     D #NAs are real & important
Activity     0.4229638 0.4561744 0.3854906  A1     D
Activity     0.4660000 0.5910000 0.2320000 PW2     B
Activity     0.1812492 0.2111999 0.1522250  CY     C
Aggression   0.2620000 0.3030000 0.1960000  PE     A
Aggression   0.3700000 0.3800000 0.3600000  PW     B
Aggression   0.4400000 0.5600000 0.3300000   A     D
Aggression   0.3740000        NA        NA  A2     D #NAs are real & important
Aggression   0.3212115 0.3471766 0.2801818  A1     D
Aggression   0.0461000 0.0995000 0.0158000 PW2     B
Aggression   0.5106432 0.5635857 0.4634950  CY     C

仅相关的ggplot代码:

pd <- position_dodge(0.3)

my_colors <- 
   tibble(color = c("orange", "black", "red", "black", "black", "pink", "black"), 
   Age = c("A","A1","A2", "CY", "PE","PW", "PW2"))

ggplot(rep, aes(x = stage, y = Repeatability, shape = Behaviour, colour=Age)) + 
    geom_point(
        position = position_dodge(width = 0.3), 
        size = 3) + 
    geom_line(
        aes(group=Behaviour), 
        position = position_dodge(width = 0.3), 
        data = function(x) inner_join(x, my_colors %>% filter(color == 'black')))+
    scale_colour_manual(
        values = c("orange", "black", "red", "black", "black", "pink", "black"), 
        name = "Study", 
        breaks=c("A","A1","A2", "CY", "PE","PW", "PW2"))+
    geom_errorbar(
        aes(ymin=LCI, ymax=UCI), 
        position=pd, 
        width=0.1, 
        size=0.5)

这是我得到的情节:

enter image description here

如何移动geom_line()使其穿过黑点?(而不是介于黑点和粉红色点之间)。

我在position = position_dodge(width = 0.3)geom_point()代码中都包含了geom_line()自变量,但不适用于geom_line()

1 个答案:

答案 0 :(得分:1)

只需将group = Behaviour移至ggplot(..., aes(..., group = Behaviour))

ggplot(rep, aes(x = stage, y = Repeatability, shape = Behaviour, colour=Age, group = Behaviour)) +
    geom_point(
        position = position_dodge(width = 0.3),
        size = 3) +
    geom_line(
        position = position_dodge(width = 0.3),
        data = function(x) inner_join(x, my_colors %>% filter(color == 'black')))+
    scale_colour_manual(
        values = c("orange", "black", "red", "black", "black", "pink", "black"),
        name = "Study",
        breaks=c("A","A1","A2", "CY", "PE","PW", "PW2"))+
    geom_errorbar(
        aes(ymin=LCI, ymax=UCI),
        position=pd,
        width=0.1,
        size=0.5)

Plot


好的,这是另一种选择。这个想法是使用jitter预计算躲避的位置。这会将类别变量stage转换为需要通过stage.jitter手动指定x轴标签的连续变量scale_x_continuous

rep %>%
    mutate(stage.jitter = jitter(as.numeric(stage), 0.5)) %>%
    ggplot(aes(x = stage.jitter, y = Repeatability, shape = Behaviour, colour=Age, group = Behaviour)) +
        geom_point(size = 3) +
        geom_line(
            data = function(x) inner_join(x, my_colors %>% filter(color == 'black')))+
        scale_colour_manual(
            values = c("orange", "black", "red", "black", "black", "pink", "black"),
            name = "Study",
            breaks=c("A","A1","A2", "CY", "PE","PW", "PW2")) +
        scale_x_continuous(
            "stage",
            labels = function(x) rep %>% pull(stage) %>% levels() %>% .[x]) +
        geom_errorbar(
            aes(ymin = LCI, ymax = UCI),
            width = 0.1,
            size = 0.5)

Second plot

您可能需要通过更改factor内的jitter值来解决抖动量。