My intention is to plot to items into same stacked bar chart as separate bars. The data frame looks like this, and the percentages are correct there.
But the proportions in the bars do not go according to the percentages. Can you find the flaw in my code?
plot_data %>%
drop_na() %>%
ggplot(mapping = aes(x = variable))
geom_bar(aes(fill = value),
position = 'fill',
width = 0.30)
scale_y_continuous(name = '% of responders',
breaks = seq(from = 0, to = 1, by = 0.2),
minor_breaks = seq(from = 0, to = 1, by = 0.1),
labels = seq(from = 0, to = 100, by = 20),
expand = c(0,0))
xlab( element_blank())
scale_fill_manual(
values = c('red', 'blue', 'green'),
labels = c(
'Yes',
'No',
'Maybe'
),
drop = FALSE
)
guides(
fill = guide_legend(title = 'Answer')
) theme(text = element_text(size = 12),
panel.background = element_blank(),
plot.margin = margin(t = 150, r = 30, b = 20, l = 0),
axis.ticks.y = element_blank(),
panel.grid.major = element_line(colour = 'grey'),
axis.ticks.x = element_line(colour = 'grey'),
panel.grid.minor = element_line(colour = 'lightgrey'),
axis.text.y = element_text(
size = 12,
face = 'plain',
hjust = 0
))
coord_flip()
ggtitle(str_wrap("Title", width = 50))
scale_x_discrete(labels = function(x)
str_wrap(x, width = 20))
My data:
plot_data <- structure(list(variable = c("Question 1", "Question 1", "Question 1",
"Question 2", "Question 2", "Question 2"), value = structure(c(1L,
2L, 3L, 1L, 2L, 3L), .Label = c("Yes", "No", "Maybe"), class = c("ordered",
"factor")), n = c(102L, 27L, 18L, 78L, 62L, 7L), pct = c(0.693877551020408,
0.183673469387755, 0.122448979591837, 0.530612244897959, 0.421768707482993,
0.0476190476190476)), class = c("grouped_df", "tbl_df", "tbl",
"data.frame"), row.names = c(NA, -6L), groups = structure(list(
variable = c("Question 1", "Question 2"), .rows = structure(list(
1:3, 4:6), ptype = integer(0), class = c("vctrs_list_of",
"vctrs_vctr", "list"))), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -2L), .drop = TRUE))
CodePudding user response:
You could add the pct values as y
aes
with geom_col
and to have an percentage y-axis you could use the percent
function from scales
like this:
library(ggplot2)
library(dplyr)
library(tidyr)
library(stringr)
plot_data %>%
drop_na() %>%
ggplot(mapping = aes(x = variable))
geom_col(aes(fill = value, y = pct),
position = 'fill',
width = 0.30)
scale_y_continuous(labels = scales::percent)
xlab( element_blank())
scale_fill_manual(
values = c('red', 'blue', 'green'),
labels = c(
'Yes',
'No',
'Maybe'
),
drop = FALSE
)
guides(
fill = guide_legend(title = 'Answer')
) theme(text = element_text(size = 12),
panel.background = element_blank(),
axis.ticks.y = element_blank(),
panel.grid.major = element_line(colour = 'grey'),
axis.ticks.x = element_line(colour = 'grey'),
panel.grid.minor = element_line(colour = 'lightgrey'),
axis.text.y = element_text(
size = 12,
face = 'plain',
hjust = 0
))
coord_flip()
ggtitle(str_wrap("Title", width = 50))
scale_x_discrete(labels = function(x)
str_wrap(x, width = 20))
Created on 2023-01-11 with reprex v2.0.2