R:在ggplot中按2个因子变量分层

时间:2017-04-03 00:56:57

标签: r ggplot2 visualization

library(ggplot2)
iris$Sepal.Length2 <- ifelse(iris$Sepal.Length < 5, 1, 0)
iris$Sepal.Width2 <- ifelse(iris$Sepal.Width < 3, 1, 0)

SmallLength <- data.frame(Petal.Length = iris$Petal.Length[iris$Sepal.Length2 == 1],
                         status = "Small Length")
LargeLength <- data.frame(Petal.Length = iris$Petal.Length[iris$Sepal.Length2 == 0],
                         status = "Large Length")
SmallWidth <- data.frame(Petal.Length = iris$Petal.Length[iris$Sepal.Width2 == 1],
                         status = "Small Width")
LargeWidth <- data.frame(Petal.Length = iris$Petal.Length[iris$Sepal.Width2 == 0],
                         status = "Large Width")

Length <- rbind(SmallLength, LargeLength)
Width <- rbind(SmallWidth, LargeWidth)
ggplot(Length, aes(Petal.Length, fill = status)) + geom_density(alpha = 0.2) + labs(x = "Petal Length")

enter image description here

我有一个连续变量Petal.Length,我希望按Sepal.LengthSepal.Width对它进行分层,两者都是我编码为二进制变量的。在上图中,我仅Petal.LengthSepal.Length分层。我如何通过Sepal.Width进一步对其进行分层?结果图可能应该有4种颜色我认为... Petal.Length 1,长度小,宽度小,1长度小,宽度大1,长度大1,宽度小1,大长度1,宽度大。

3 个答案:

答案 0 :(得分:3)

无需为此创建单独的数据框,您可以使用完整的iris数据集实现所需的一切:

iris$length_binary <- ifelse(iris$Sepal.Length < 5, "Small", "Large")
iris$width_binary <- ifelse(iris$Sepal.Width < 3, "Small", "Large")
iris$length_width = interaction(iris$length_binary, iris$width_binary, sep=", ")

ggplot(iris, aes(Petal.Length, fill = length_width)) + 
    geom_density(alpha = 0.2) + 
    labs(x = "Petal Length",
         fill = "Length, Width")

结果:

enter image description here

答案 1 :(得分:2)

以下是使用管道的示例 - 使用您需要的数据来获取数据的长度和重量。

library(tidyverse)
iris %>% 
   mutate(statusl = factor(ifelse(Sepal.Length<5,'Small length', 'Large length')),
          statusw = factor(ifelse(Sepal.Width<3,'Small width', 'Large width')))  %>% 
   ggplot(aes(Petal.Length, fill=interaction(statusl, statusw))) + 
         geom_density(alpha = 0.2) + xlab("Petal Length")

答案 2 :(得分:0)

实现此目的的一种方法是将您想要对图形进行分层的变量置于geom_density图层内:

ggplot(data = df, aes(x = , y = ) +
  geom_line(aes(color = factored_variable))

更多详情:Plotting two variables as lines using ggplot2 on the same graph