Eu tenho esse quadro de dados em R chamado df:
df
# A tibble: 5 × 7
var n `Very \n Dissatisfied` Dissatisfied Neutral Satisfied `Very \n Satisfied`
<chr> <int> <dbl> <dbl> <dbl> <dbl> <dbl>
1 A 106 18.9 14.5 23.0 22.0 21.7
2 B 106 19.2 16.0 25.5 18.9 20.4
3 C 87 22.2 25.3 15.7 17.2 19.5
4 D 102 19.0 19.0 21.2 22.9 18.0
5 E 99 22.2 20.5 20.9 17.5 18.9
a partir deste quadro de dados criei dois gráficos, um gráfico Likert e um gráfico de barras:
df_long <- df %>%
select(-n)%>%
pivot_longer(!var, names_to = "Likert", values_to = "Percentage")
# Likert plot
likert_plot <- ggplot(df_long, aes(x = var, y = Percentage, fill = Likert)) +
geom_col(position = position_likert(reverse = FALSE)) +
geom_text(
aes(
label = label_percent_abs(hide_below = .01, accuracy = 1)(Percentage),
color = after_scale(hex_bw(.data$fill))
),
position = position_likert(vjust = 0.5, reverse = FALSE),
size = 3.5
) +
scale_y_continuous(labels = scales::percent) +
labs(
title = "Likert Responses by Category",
x = "Category",
y = "Percentage",
fill = "Likert Scale"
) +
coord_flip()+
theme_minimal()+scale_fill_manual(values = custom_colors) +
labs(x = NULL, y = NULL, fill = NULL)
# Horizontal bar plot
bar_plot <- ggplot(df, aes(x = n, y = var)) +
geom_bar(stat = "identity", fill = "lightgrey") +
geom_label(
aes(
label = label_number_abs(hide_below = .05, accuracy = 2)(n)
),
size = 3.5,
position = position_stack(vjust = 0.5),
hjust = 1,
fill = NA,
label.size = 0,
color = "black"
) +
scale_y_discrete(labels = \(x) gsub("\\..*$", "", x)) +
scale_x_continuous(
labels = label_percent_abs(),
expand = c(0, .15)
) +
theme_light() +
theme(
legend.position = "bottom",
panel.grid.major.y = element_blank(),
axis.text.x = element_blank() # Hides x-axis numbers
) +
labs(x = NULL, y = NULL, fill = NULL)
# Print plots
(likert_plot) +(bar_plot)+
plot_layout(
width = c(4,1)
) &
theme(legend.position = "bottom")
que se parecem com isto:
Eu quero :
- as porcentagens dentro de cada nível de barra para arredondá-las para 0 casas decimais
- torná-los ousados
- some os totais à direita e à esquerda. (ou seja, os totais à esquerda são a soma de muito insatisfeito e satisfeito e os totais à direita são a soma de satisfeito e muito satisfeito)
Como posso conseguir isso em R?
Dados
dput(df)
structure(list(var = c("A", "B", "C", "D", "E"), n = c(106L,
106L, 87L, 102L, 99L), `Very
Dissatisfied` = c(18.8679245283019,
19.1823899371069, 22.2222222222222, 18.9542483660131, 22.2222222222222
), Dissatisfied = c(14.4654088050314, 16.0377358490566, 25.2873563218391,
18.9542483660131, 20.5387205387205), Neutral = c(22.9559748427673,
25.4716981132075, 15.7088122605364, 21.2418300653595, 20.8754208754209
), Satisfied = c(22.0125786163522, 18.8679245283019, 17.2413793103448,
22.8758169934641, 17.5084175084175), `Very
Satisfied` = c(21.6981132075472,
20.440251572327, 19.5402298850575, 17.9738562091503, 18.8552188552189
)), row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame"
))
Para atingir o resultado desejado, defina o
scale=
parâmetro emlabel_percent_abs
como 1 para evitar que as proporções sejam multiplicadas pelo padrão 100. Para ter rótulos em negrito, usefontface="bold"
emgeom_text
. Finalmente, para obter os rótulos, você pode usar um dataframe separado onde você calcula os totais (semelhante ao que eu fiz nas respostas às suas perguntas anteriores), então use um segundogeom_text/label
: