Я пытаюсь создать сгруппированный/сложенный столбчатый график в R, который выглядит следующим образом:
У меня есть данные:
Я запускаю код:
ggplot(DCE, aes(x=as.character(misery_diff), y=number, fill=choice)) + geom_bar(stat = "identity")
Но получил ошибку:
Error: Aesthetics must be either length 1 or the same as the data (20): x
Run `rlang::last_error()` to see where the error occurred.
Мои вопросы: 1) Это правильный код для получения этого графика? 2) Что не так с кодом, который я запускаю?
Заранее спасибо!
Спасибо за ваш комментарий, я разместил данные в виде таблицы.
Ваш код отлично работает с вашими данными.
Я запустил его снова и получил ту же ошибку.
Это ваши данные. В вашей таблице у вас есть misery_dif
, а в вашем коде в вопросе у вас есть misery_diff
, там опечатка?
df <-
tibble::tribble(
~misery_dif, ~choice, ~number,
-5, "choice A", 56,
-5, "choice B", 1,
-4, "choice A", 32,
-4, "choice B", 12,
-3, "choice A", 153,
-3, "choice B", 23,
-2, "choice A", 398,
-2, "choice B", 120,
-1, "choice A", 196,
-1, "choice B", 77,
0, "choice A", 318,
0, "choice B", 334,
1, "choice A", 235,
1, "choice B", 316,
2, "choice A", 76,
2, "choice B", 347,
3, "choice A", 45,
3, "choice B", 159,
4, "choice A", 5,
4, "choice B", 96
)
Это сюжет простых подсчетов
library(dplyr)
library(ggplot2)
df %>%
ggplot(aes(factor(misery_dif), number, fill=choice))+
geom_bar(stat = "identity")
Это не то, что вам нужно, но может помочь вам понять, что происходит.
Обратите внимание, что я использую
factor()
, а неas.character()
. Фактор — это то, что вам нужно, чтобы R понял, что это числовой фактор с определенными уровнями.
Теперь рассчитайте процент и измените уровни выбора, чтобы они соответствовали ожидаемому результату.
df %>%
group_by(misery_dif) %>%
mutate(percent = number/sum(number),
choice = factor(choice, levels =c("choice B", "choice A"))) %>%
# now plot the thing
ggplot(aes(factor(misery_dif), percent, fill=choice))+
geom_bar(stat = "identity") +
scale_fill_manual(values=c("gray80", "black")) +
scale_y_continuous(labels = scales::label_percent())+
labs(x = "Distance from misery indexes between A and B", y = "")
пожалуйста, опубликуйте
dput(DCE)
не картинку, чтобы другие могли воспроизвести вашу проблему