Nathalie
Nathalie

Reputation: 1238

More than one density plots into one

Having three dataframes like this:

library(tidyverse)
library(ggplot2)

Dataframe 1:

df1 <- structure(list(company = structure(c(3L, 5L, 1L, 2L, 4L, 3L, 
5L, 1L, 2L, 4L, 3L, 5L, 1L, 2L, 4L, 3L, 5L, 1L, 2L, 4L, 3L, 5L, 
1L, 2L, 4L, 3L, 5L, 1L, 2L, 4L, 3L, 5L, 1L, 2L, 4L, 3L, 5L, 1L, 
2L, 4L), .Label = c("amazon", "bsd", "google", "so", "yahoo"), class = "factor"), 
    period = structure(c(2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 
    1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
    2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 
    1L), .Label = c("after", "before"), class = "factor"), val = c(0.262776250810038, 
    0.187917588433778, 0.697682733346741, 0.158756228911086, 
    0.378985944448169, 0.249033541149918, 0.157828875332395, 
    0.762575137985743, 0.148767625304462, 0.394985586914259, 
    0.268776116734822, 0.177604969721347, 0.694811289133204, 
    0.160510379656321, 0.389823691090702, 0.280675292172242, 
    0.181169135885232, 0.655493731983643, 0.177839601349691, 
    0.387633795892829, 0.257949543026971, 0.169661013161717, 
    0.665359433308753, 0.149795535295301, 0.384002592120846, 
    0.244474983799245, 0.162231011597506, 0.650253625617304, 
    0.147493910750598, 0.424582690889589, 0.291490692945409, 
    0.241190141002436, 0.622555920538089, 0.215134857321624, 
    0.383108757346205, 0.25750262563965, 0.230989251636835, 0.708699246944202, 
    0.193749860338316, 0.427264195213515)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -40L))

Second:

df2 <- structure(list(company = structure(c(3L, 5L, 1L, 2L, 4L, 3L, 
5L, 1L, 2L, 4L, 3L, 5L, 1L, 2L, 4L, 3L, 5L, 1L, 2L, 4L, 3L, 5L, 
1L, 2L, 4L, 3L, 5L, 1L, 2L, 4L, 3L, 5L, 1L, 2L, 4L, 3L, 5L, 1L, 
2L, 4L), .Label = c("amazon", "bsd", "google", "so", "yahoo"), class = "factor"), 
    period = structure(c(2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 
    1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
    2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 
    1L), .Label = c("after", "before"), class = "factor"), val = c(0.262776250810038, 
    0.187917588433778, 0.697682733346741, 0.158756228911086, 
    0.378985944448169, 0.249033541149918, 0.157828875332395, 
    0.762575137985743, 0.148767625304462, 0.394985586914259, 
    0.268776116734822, 0.177604969721347, 0.694811289133204, 
    0.160510379656321, 0.389823691090702, 0.280675292172242, 
    0.181169135885232, 0.655493731983643, 0.177839601349691, 
    0.387633795892829, 0.257949543026971, 0.169661013161717, 
    0.665359433308753, 0.149795535295301, 0.384002592120846, 
    0.244474983799245, 0.162231011597506, 0.650253625617304, 
    0.147493910750598, 0.424582690889589, 0.291490692945409, 
    0.241190141002436, 0.622555920538089, 0.215134857321624, 
    0.383108757346205, 0.25750262563965, 0.230989251636835, 0.708699246944202, 
    0.193749860338316, 0.427264195213515)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -40L))

Third:

df3 <- structure(list(company = structure(c(3L, 5L, 1L, 2L, 4L, 3L, 
5L, 1L, 2L, 4L, 3L, 5L, 1L, 2L, 4L, 3L, 5L, 1L, 2L, 4L, 3L, 5L, 
1L, 2L, 4L, 3L, 5L, 1L, 2L, 4L, 3L, 5L, 1L, 2L, 4L, 3L, 5L, 1L, 
2L, 4L), .Label = c("amazon", "bsd", "google", "so", "yahoo"), class = "factor"), 
    period = structure(c(2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 
    1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
    2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 
    1L), .Label = c("after", "before"), class = "factor"), val = c(0.262776250810038, 
    0.187917588433778, 0.697682733346741, 0.158756228911086, 
    0.378985944448169, 0.249033541149918, 0.157828875332395, 
    0.762575137985743, 0.148767625304462, 0.394985586914259, 
    0.268776116734822, 0.177604969721347, 0.694811289133204, 
    0.160510379656321, 0.389823691090702, 0.280675292172242, 
    0.181169135885232, 0.655493731983643, 0.177839601349691, 
    0.387633795892829, 0.257949543026971, 0.169661013161717, 
    0.665359433308753, 0.149795535295301, 0.384002592120846, 
    0.244474983799245, 0.162231011597506, 0.650253625617304, 
    0.147493910750598, 0.424582690889589, 0.291490692945409, 
    0.241190141002436, 0.622555920538089, 0.215134857321624, 
    0.383108757346205, 0.25750262563965, 0.230989251636835, 0.708699246944202, 
    0.193749860338316, 0.427264195213515)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -40L))

We can create a density plot for every data frame using this:

df_long %>%
  ggplot(aes(x = val, color = company, linetype = period)) +
  geom_density() +
  theme_bw()

How is it possible to create three plots into one using the three different dataframe the one to be down from the other and have titles like Grey for df1 plot Temperature for df2 plot and Time for df3 plot?

enter image description here

Upvotes: 0

Views: 37

Answers (1)

teunbrand
teunbrand

Reputation: 38063

If your data has compatible columns, like your example data, you could combine them into one large dataframe first, marking their origin.

newdf <- rbind(
  cbind(df1, category = "Grey"),
  cbind(df2, category = "Temperature"),
  cbind(df3, category = "Time")
)

ggplot(newdf, aes(val, colour = company, linetype = period)) +
  geom_density() +
  facet_wrap(~ category, ncol = 1)

enter image description here

Alternatively, if the data is not compatible but still have the same column names, you could specify every data frame to a layer seperately.


ggplot(mapping = aes(val, colour = company, linetype = period)) +
  geom_density(data = cbind(df1, facet = "Grey")) +
  geom_density(data = cbind(df2, facet = "Temperature")) +
  geom_density(data = cbind(df3, facet = "Time")) +
  facet_wrap(~ facet, ncol = 1)

enter image description here

If the column names don't match, you should specify the mapping = aes(...) argument in every layer seperately instead of in the call to ggplot().

Upvotes: 2

Related Questions