Создание сгруппированного/сложенного гистограммы в R дает ошибку: эстетика должна быть либо длиной 1, либо такой же, как данные

Я пытаюсь создать сгруппированный/сложенный столбчатый график в R, который выглядит следующим образом:

У меня есть данные:

misery_dif выбор число -5 выбор А 56 -5 выбор Б 1 -4 выбор А 32 -4 выбор Б 12 -3 выбор А 153 -3 выбор Б 23 -2 выбор А 398 -2 выбор Б 120 -1 выбор А 196 -1 выбор Б 77 0 выбор А 318 0 выбор Б 334 1 выбор А 235 1 выбор Б 316 2 выбор А 76 2 выбор Б 347 3 выбор А 45 3 выбор Б 159 4 выбор А 5 4 выбор Б 96

Я запускаю код:

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) Что не так с кодом, который я запускаю?

Заранее спасибо!

пожалуйста, опубликуйте dput(DCE) не картинку, чтобы другие могли воспроизвести вашу проблему

Matias Andina 12.12.2020 19:50

Спасибо за ваш комментарий, я разместил данные в виде таблицы.

Svetlana Ratushnyak 12.12.2020 20:13

Ваш код отлично работает с вашими данными.

YBS 12.12.2020 20:28

Я запустил его снова и получил ту же ошибку.

Svetlana Ratushnyak 12.12.2020 20:31
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
144
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это ваши данные. В вашей таблице у вас есть 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 = "")

Другие вопросы по теме