仅在某些因子水平上生成多行以进行重复观察

时间:2017-03-03 18:03:54

标签: r ggplot2

我正在为观察生成密度图。观察属于一个物种,一些也与个体ID相关。

根据下面的数据,我想为物种一和二的每个IndID水平生成一条线,而对于物种三只生成一条线,不包括IndID。 There are related questions关于SO,但没有可重现的数据并寻找不同的结果。

library(ggplot2)
set.seed(1)
dat <- data.frame(Species = c(rep(c("One", "Two"), each = 2, length = 30), rep("Three",50)),
                  IndID = c(rep(letters[1:5],each = 6),rep(NA,50) ),
                  Value = sample(1:20, replace = T))

在物种层面上保持颜色禁欲,我想为物种一和二(绿色和红色)创建多条线,为物种三创建一条蓝线。

ggplot(dat, aes(Value)) + geom_density(aes(color = Species), size = 1.25) + 
  scale_colour_manual(values = c("darkgreen","blue", "red"))

enter image description here

1 个答案:

答案 0 :(得分:1)

如果您希望能够区分它们,可以将linetype设置为IndID。但请注意,您需要将NA更改为其他值,以便(轻松)将其更改为绘图。

我还对您的数据进行了一些扩展,以便为每个人提供足够的值来显示有意义的行。我还使用了geom_line(stat = "density")而不是geom_density(),因为它省略了底部的行,并使用行而不是框来提供图例。

set.seed(1)
dat <- data.frame(Species = c(rep(c("One", "Two"), each = 2, length = 60), rep("Three",50)),
                  IndID = c(rep(letters[1:5],each = 12),rep("NA",50) ),
                  Value = sample(1:20, 110, replace = T))


ggplot(dat
       , aes(x = Value
             , color = Species
             , linetype = IndID)) +
  geom_line(stat = "density"
            , size = 1.25) + 
  scale_colour_manual(values = c("darkgreen","blue", "red"))

给出

enter image description here

如果您希望所有线都是实线,则可以运行:

ggplot(dat
       , aes(x = Value
             , color = Species
             , linetype = IndID)) +
  geom_line(stat = "density"
            , size = 1.25) + 
  scale_colour_manual(values = c("darkgreen","blue", "red")) +
  scale_linetype_manual(values = rep("solid", 6)) +
  guides(linetype = "none")

(或使用group作为@Henrik在zir评论中建议的