根据斜率改变ggplot中的线条颜色

时间:2015-12-06 04:19:03

标签: r ggplot2

我有以下代码绘制点并在它们之间画一条线。

ggplot (data = subset(df, vowel == "O" & gender == "f"), aes (x = time, y = val, color = formant)) +
      geom_point()+
      geom_line(aes(group=interaction(formant, number)))

它产生了这个:

enter image description here

对于负斜率与这些线的正斜率,有没有办法按颜色/线型分组?

编辑: 这是我的数据:

number <- c(1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3)
formant <- c("F2", "F2", "F2", "F2", "F2", "F2", "F3", "F3", "F3", "F3", "F3", "F3")
time <- c(50, 50, 50, 99, 99, 99, 50, 50, 50, 99, 99, 99)
val <- c(400, 500, 600, 450, 550, 650, 300, 400, 500, 250, 350, 450)

我希望显示val超过time formantnumber分组的值的移动。因此,当我实现答案时,它告诉我我的大小不兼容,我认为这与它按数字分组的事实有关。

1 个答案:

答案 0 :(得分:9)

您还没有提供样本数据,所以这是一个程式化的示例。一般的想法是,您创建一个变量来测试斜率是否大于零,然后将其映射到颜色美学。在这种情况下,我使用dplyr链接运算符(%>%)以便在ggplot的调用中动态添加斜率。 (我去计算斜率的麻烦,但你也可以测试是否value[t==2] > value[t==1]。)

library(dplyr)

# Fake data
set.seed(205)
dat = data.frame(t=rep(1:2, each=10), 
                 pairs=rep(1:10,2), 
                 value=rnorm(20), 
                 group=rep(c("A","B"), 10))

dat$value[dat$group=="A"] = dat$value[dat$group=="A"] + 6

ggplot(dat %>% group_by(pairs) %>%
         mutate(slope = (value[t==2] - value[t==1])/(2-1)),
       aes(t, value, group=pairs, linetype=group, colour=slope > 0)) +
  geom_point() +
  geom_line()

enter image description here

更新:根据您的评论,您只需要将number映射到审美或使用分面。这是使用您的示例数据的分面版本:

df = data.frame(number, formant, time, val)

# Shift val a bit
set.seed(1095)
df$val = df$val + rnorm(nrow(df), 0, 10)

ggplot (df %>% group_by(formant, number) %>%
          mutate(slope=(val[time==99] - val[time==50])/(99-50)), 
        aes (x = time, y = val, linetype = formant, colour=slope > 0)) +
  geom_point()+
  geom_line(aes(group=interaction(formant, number))) +
  facet_grid(. ~ number)

enter image description here

这是将number映射到点标记大小的另一个选项。这看起来并不是很好,但仅用于说明如何将变量映射到不同的美学和#34; (图中的颜色,形状,大小等)。

ggplot (df %>% group_by(formant, number) %>% 
          mutate(slope=(val[time==99] - val[time==50])/(99-50)), 
        aes (x = time, y = val, linetype = formant, colour=slope > 0)) +
  geom_point(aes(size=number))+
  geom_line(aes(group=interaction(formant, number)))