This question already has answers here:
Closed 2 years ago.
What is the simplest way to do with ggplot the same as done here:
![](https://www.manongdao.com/static/images/pcload.jpg)
Do I need call prop.table or maybe there is a simplier way?
REPRODUCTABLE EXAMPLE:
x <- c("good", "good", "bad", "bad", "bad", "bad", "perfect", "perfect", "perfect")
y <- c("exercise1", "exercise2", "exercise3", "exercise1", "exercise2", "exercise3", "exercise1", "exercise2", "exercise3")
dt <- data.frame(x, y)
ggplot(dt, aes(x, fill = y)) + geom_bar()
This is a similar question to this previous one here. You can use the position = "fill"
argument within ggplot to scale bars to 100% height. The scale_y_continuous(labels = scales::percent)
command changes the frequency scale from 0-1 to 0-100%.
library(ggplot2)
x <- c("good", "good", "bad", "bad", "bad", "bad", "perfect", "perfect", "perfect")
y <- c("exercise1", "exercise2", "exercise3", "exercise1", "exercise2", "exercise3", "exercise1", "exercise2", "exercise3")
dt <- data.frame(x, y)
# Build plot
ggplot(dt, aes(x, fill = y)) +
geom_bar(position = "fill") +
scale_y_continuous(labels = scales::percent)
![](https://www.manongdao.com/static/images/pcload.jpg)
It's hard to answer your question without reproducible data, but generally you would want something like this:
library(ggplot2)
ggplot(data = YourData, aes(x = LevelNumVar, y = CountVar, fill = LevelLetterVar)) +
geom_bar(stat = "identity")
Where: LevelNumVar is your variable on the x-axis, LevelLetterVar is the variable you're shading on, and CountVar is your variable on the y-axis.
Here's the code using your data:
library(dplyr)
library(ggplot2)
x <- c("good", "good", "bad", "bad", "bad", "bad", "perfect", "perfect", "perfect")
y <- c("exercise1", "exercise2", "exercise3", "exercise1", "exercise2", "exercise3", "exercise1", "exercise2", "exercise3")
dt <- data.frame(x, y)
dt <- dt %>%
group_by(x, y) %>%
summarise(count = n())
ggplot(dt, aes(x = x, y = count, fill = y)) +
geom_bar(stat = "identity")