我有以下代码绘制点并在它们之间画一条线.
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
.所以,当我实现了答案,它告诉我,我有一个不兼容的大小,我觉得事做的事实,它是由数分组.
您还没有提供示例数据,所以这是一个程式化的示例.一般的想法是,您创建一个变量来测试斜率是否大于零,然后将其映射到颜色美学.在这种情况下,我使用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
到点标记大小的选项.这看起来不太好,但仅用于说明如何将变量映射到图中不同的"美学"(颜色,形状,大小等).
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)))