ИМХО, принятый ответ можно улучшить, чтобы лучше отражать структуру данных ОП
- , сохранив порядок столбцов
before
и after
и - путем сохранения заданного порядка строк.
Для достижения этого есть два варианта:
- Либо превратить категориальные переменные в факторы с уровнями втребуемый порядок
- или укажите требуемый порядок при построении с использованием
scale_discrete()
.
В приведенном ниже коде используются оба метода:
library(ggplot2)
library(tidyr)
library(dplyr)
df %>%
mutate(type = forcats::fct_inorder(type)) %>% # preserve row order
gather("var", "share", before, after) %>%
ggplot(aes(x = var, y = share, fill = type)) +
geom_col(position = "fill") +
scale_x_discrete(limits = c("before", "after"), name = NULL) + # specify column order
scale_y_continuous(labels = scales::percent)
для получения графического эквивалентаданных OP:

Кроме того, geom_col()
используется в качестве ярлыка для geom_bar(stat = "identity")
, а ось y помечена соответствующим образом.
Данные
Поскольку ОП не предоставил воспроизводимый набор данных, но разместил изображение данных, я использовал онлайновый сервис OCR для преобразования снимка экрана в текст.(Для полноты картины: если вы искали "online ocr" и выбрали случайным образом https://www.newocr.com/, что вначале дает желаемый результат).
Затем результат распознавания был скопирован во фрагмент кода ниже:
df <- readr::read_table2(
"type before after
january 297 237
february 182 67
march 234 34
april 55 117")