I have a **dataframe** in R :

x1 | x2 | x3 | |
---|---|---|---|

a | 40 | 38 | 45 |

b | 5 | 5 | 3 |

c | 3 | 6 | 2 |

d | 2 | 1 | 1 |

I would like to create a stacked bar plot like shown:

How should I do? Please note that its a **dataframe**

I have a **dataframe** in R :

x1 | x2 | x3 | |
---|---|---|---|

a | 40 | 38 | 45 |

b | 5 | 5 | 3 |

c | 3 | 6 | 2 |

d | 2 | 1 | 1 |

I would like to create a stacked bar plot like shown:

How should I do? Please note that its a **dataframe**

I recommend transforming your data into long format and assigning factors to `a`

, `b`

, `c`

, and `d`

:

```
library(tidyverse)
# Recreating the original dataset
x1 <- c(40, 5, 3, 2)
x2 <- c(38, 5, 6, 1)
x3 <- c(45, 3, 2, 1)
df <- as.data.frame(cbind(x1, x2, x3))
cat <- c("a", "b", "c", "d")
rownames(df) <- cat
# Transforming to long format and assigning factors
df_new <- cbind(df, cat)
df_long <- df_new %>%
gather(`x1`, `x2`, `x3`,
key = "cat",
value = "X") %>%
mutate(xlev = cat) %>%
mutate(value = X) %>%
mutate(categ = rep(c("a", "b", "c", "d"), 3)) %>%
mutate(categ = factor(categ)) %>%
select(xlev, value, categ)
head(df_long)
#> xlev value categ
#> 1 x1 40 a
#> 2 x1 5 b
#> 3 x1 3 c
#> 4 x1 2 d
#> 5 x2 38 a
#> 6 x2 5 b
```

*(Disclaimer - the above code is pretty messy; I'm not the best with gather()!)*

Then, use `ggplot2()`

with `geom_col()`

to create the stacked bar graph:

```
plot1 <- ggplot(data = df_long, aes(x = xlev, y = value, fill = fct_rev(categ))) +
geom_col(aes(y = value)) +
ggtitle("a, b, c, and d") +
theme(legend.title = element_blank(),
axis.title = element_blank())
plot1
```

Created on 2018-09-18 by the reprex package (v0.2.0).

The rest is cosmetic - you can set the fill colors using `scale_fill_manual()`

or possibly apply a palette that's different than the default. The background color can be set with adding `panel.background = element_blank()`

to the `theme()`

statement.

I hope this helps!

3 Likes