user3526009
user3526009

Reputation: 33

How to use facetting with 4 variables

My data looks like as shown below:

structure(list(content = c("Proteins", "Carbohydrates", "Lipids", 
"Ash", "Moisture", "Proteins", "Carbohydrates", "Lipids", "Ash", 
"Moisture", "Proteins", "Carbohydrates", "Lipids", "Ash", "Moisture", 
"Proteins", "Carbohydrates", "Lipids", "Ash", "Moisture", "Proteins", 
"Carbohydrates", "Lipids", "Ash", "Moisture", "Proteins", "Carbohydrates", 
"Lipids", "Ash", "Moisture"), quantity = c(1.58, 4.22, 5.2, 6.5, 
7, 1.95, 5.11, 5.6, 9.7, 7.2, 2.15, 5.05, 4.3, 9, 7.4, 2.71, 
3.47, 5.2, 8, 8, 2.63, 4.77, 7, 7.6, 6.9, 3.01, 5.38, 6.6, 11, 
5.9), city = c("Amravati", "Amravati", "Amravati", "Amravati", 
"Amravati", "Amravati", "Amravati", "Amravati", "Amravati", "Amravati", 
"Amravati", "Amravati", "Amravati", "Amravati", "Amravati", "Amravati", 
"Amravati", "Amravati", "Amravati", "Amravati", "Amravati", "Amravati", 
"Amravati", "Amravati", "Amravati", "Amravati", "Amravati", "Amravati", 
"Amravati", "Amravati"), year = c(2009L, 2009L, 2009L, 2009L, 
2009L, 2009L, 2009L, 2009L, 2009L, 2009L, 2010L, 2010L, 2010L, 
2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2011L, 2011L, 
2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L), plant = c("Cassia simea", 
"Cassia simea", "Cassia simea", "Cassia simea", "Cassia simea", 
"Cassia simea", "Cassia simea", "Cassia simea", "Cassia simea", 
"Cassia simea", "Cassia simea", "Cassia simea", "Cassia simea", 
"Cassia simea", "Cassia simea", "Cassia simea", "Cassia simea", 
"Cassia simea", "Cassia simea", "Cassia simea", "Cassia simea", 
"Cassia simea", "Cassia simea", "Cassia simea", "Cassia simea", 
"Cassia simea", "Cassia simea", "Cassia simea", "Cassia simea", 
"Cassia simea"), status = c("Non_Polluted", "Non_Polluted", "Non_Polluted", 
"Non_Polluted", "Non_Polluted", "Polluted", "Polluted", "Polluted", 
"Polluted", "Polluted", "Non_Polluted", "Non_Polluted", "Non_Polluted", 
"Non_Polluted", "Non_Polluted", "Polluted", "Polluted", "Polluted", 
"Polluted", "Polluted", "Non_Polluted", "Non_Polluted", "Non_Polluted", 
"Non_Polluted", "Non_Polluted", "Polluted", "Polluted", "Polluted", 
"Polluted", "Polluted")), .Names = c("content", "quantity", "city", 
"year", "plant", "status"), class = "data.frame", row.names = c(NA, 
-30L))

         content quantity     city year        plant       status
1       Proteins     1.58 Amravati 2009 Cassia simea Non_Polluted
2  Carbohydrates     4.22 Amravati 2009 Cassia simea Non_Polluted
3         Lipids     5.20 Amravati 2009 Cassia simea Non_Polluted
4            Ash     6.50 Amravati 2009 Cassia simea Non_Polluted
5       Moisture     7.00 Amravati 2009 Cassia simea Non_Polluted
6       Proteins     1.95 Amravati 2009 Cassia simea     Polluted
7  Carbohydrates     5.11 Amravati 2009 Cassia simea     Polluted
8         Lipids     5.60 Amravati 2009 Cassia simea     Polluted
9            Ash     9.70 Amravati 2009 Cassia simea     Polluted
10      Moisture     7.20 Amravati 2009 Cassia simea     Polluted
11      Proteins     2.15 Amravati 2010 Cassia simea Non_Polluted
12 Carbohydrates     5.05 Amravati 2010 Cassia simea Non_Polluted
13        Lipids     4.30 Amravati 2010 Cassia simea Non_Polluted
14           Ash     9.00 Amravati 2010 Cassia simea Non_Polluted
15      Moisture     7.40 Amravati 2010 Cassia simea Non_Polluted
16      Proteins     2.71 Amravati 2010 Cassia simea     Polluted
17 Carbohydrates     3.47 Amravati 2010 Cassia simea     Polluted
18        Lipids     5.20 Amravati 2010 Cassia simea     Polluted
19           Ash     8.00 Amravati 2010 Cassia simea     Polluted
20      Moisture     8.00 Amravati 2010 Cassia simea     Polluted
21      Proteins     2.63 Amravati 2011 Cassia simea Non_Polluted
22 Carbohydrates     4.77 Amravati 2011 Cassia simea Non_Polluted
23        Lipids     7.00 Amravati 2011 Cassia simea Non_Polluted
24           Ash     7.60 Amravati 2011 Cassia simea Non_Polluted
25      Moisture     6.90 Amravati 2011 Cassia simea Non_Polluted
26      Proteins     3.01 Amravati 2011 Cassia simea     Polluted
27 Carbohydrates     5.38 Amravati 2011 Cassia simea     Polluted
28        Lipids     6.60 Amravati 2011 Cassia simea     Polluted
29           Ash    11.00 Amravati 2011 Cassia simea     Polluted
30      Moisture     5.90 Amravati 2011 Cassia simea     Polluted

I would like to make a barplot or scatterplot of content vs quantity from the data. My dataframe includes data for two cities (Amravati & Aurangabad), three years(2009, 2010, 2011), three plants (cassia simea, catheranthus roseus & datura metel) and two status (polluted and non-polluted).

I have tried to make a barplot using ggplot2, but I could plot only with one facet_wrap. The R code I used is:

c <- ggplot(amr_nine, aes(content,quantity,fill=plant)) + 
    geom_bar() + 
    facet_wrap(~status) + 
    theme(axis.text.x = element_text(colour = "black"))+
    theme(axis.text.y = element_text(colour = "black"))+ 
    theme(panel.background = element_rect(fill='white', colour='black')) + 
    theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank()) +
    scale_fill_manual(values=c("red", "blue", "green"))

My question is can we have multiple facets? so that I can include all my variables (i.e. cities, years, plants and status etc.). If not any other solution to plot all these variables in single plot is highly appreciated.

Thanks in advance...

Upvotes: 1

Views: 154

Answers (2)

Jaap
Jaap

Reputation: 83215

When you want to put everything into one plot, it is better to use facet_grid instead of facet_wrap. For the following three examples, I added also some data for the other two plant species (for the other two plant species I used the same quantity-values, but changed the order a bit) and for the other city:

ggplot(amr_nine, aes(content,quantity,fill=plant)) + 
  geom_bar(stat="identity") + 
  theme(panel.background = element_rect(fill='white', colour='black'),
        panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        axis.text.x=element_text(angle=90)) +
  scale_fill_manual(values=c("red", "blue", "green")) +
  facet_grid(city ~ status+year)

you get something like: enter image description here


However, considering your data, I would advise to make a faceted plot for each city:

ggplot(amr_nine[amr_nine$city=="Amravati",], aes(content,quantity,fill=plant)) + 
  geom_bar(stat="identity") + 
  theme(panel.background = element_rect(fill='white', colour='black'),
        panel.grid.major = element_blank(), panel.grid.minor = element_blank()) +
  scale_fill_manual(values=c("red", "blue", "green")) +
  facet_wrap(~status+year)

which gives: enter image description here

You can repeat this for the other city (Aurangabad).

Besides stacking the bars on top of each other, you can also put them next to each other by adding position="dodge" to the geom_bar part of your code.


Another solution is to use line-graphs instead of a bar-plot:

ggplot(amr_nine, aes(as.factor(year), quantity, color=plant, group=plant)) + 
  geom_line() + 
  theme(panel.background = element_rect(fill='white', colour='black'),
        panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        axis.text.x=element_text(angle=90)) +
  scale_color_manual(values=c("red", "blue", "green")) +
  facet_grid(content ~ city + status)

which gives: enter image description here

Upvotes: 3

MrFlick
MrFlick

Reputation: 206197

You can have multiple factets, just bot all your conditioning variables in the same formula

facet_wrap(~status+plant+year+city)

same factedted image

Upvotes: 1

Related Questions