我有以下代码绘制点并在它们之间画一条线。
ggplot (data = subset(df, vowel == "O" & gender == "f"), aes (x = time, y = val, color = formant)) +
geom_point()+
geom_line(aes(group=interaction(formant, number)))
它产生了这个:
对于负斜率与这些线的正斜率,有没有办法按颜色/线型分组?
编辑: 这是我的数据:
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
formant
和number
分组的值的移动。因此,当我实现答案时,它告诉我我的大小不兼容,我认为这与它按数字分组的事实有关。
答案 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()
更新:根据您的评论,您只需要将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)
这是将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)))