当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《根据斜率改变ggplot中的线条颜色》经验,为你挑选了1个好方法。

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

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)

我想表现出的价值变动valtime的分组formantnumber.所以,当我实现了答案,它告诉我,我有一个不兼容的大小,我觉得事做的事实,它是由数分组.



1> eipi10..:

您还没有提供示例数据,所以这是一个程式化的示例.一般的想法是,您创建一个变量来测试斜率是否大于零,然后将其映射到颜色美学.在这种情况下,我使用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)))

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有