Как нарисовать сгруппированный график из двух фреймов данных? - PullRequest
0 голосов
/ 30 мая 2020

У меня есть две вещи, которые я хочу сравнить:

  1. Данные из вопросника, который я собрал сам.
  2. Распределение выборки нормы от людей, разработавших опросник.

Вот гистограмма моих данных:

ggplot(myData) + 
  geom_bar(mapping = aes(x = DepriSymptoms, y = ..prop..,  group = 1)) +
  theme_bw() +
  scale_y_continuous(labels = scales::percent_format()) +
  labs(y = "Participant Count",
       x = "Symptoms",
       title = "Depression Symptom Severity")

Гистограмма моих данных

У меня нет фактических данных из стандартной выборки я знаю только проценты:

  • нет: 70%
  • подозреваемых: 9%
  • светлых: 15%
  • средний: 4%
  • серьезный: 1%

Моя цель - сгруппированная диаграмма ggplot2, которая выглядит примерно так:

Мокап сгруппированной диаграммы

Один цвет - мои данные, другой цвет - образец нормы.

Вот мой вопрос: Как лучше всего заставить ggplot2 рисовать полосы для образца нормы, поскольку у меня нет данных?

Я подумал о создании нового фрейма данных с «фальшивыми» данными с правильными процентами и с использованием двух слоев geom_bar, но теперь они друг на друга, и я не могу использовать переменную заполнения для группировки, поскольку они взяты из разных фреймов данных.


ggplot() + 
  geom_bar(data = myData, mapping = aes(x = DepriSymptoms, y = ..prop..,  group = 1), alpha = 0.5, fill = 'blue') +
  geom_bar(data = fakeData, mapping = aes(x = DepriSymptoms, y = ..prop..,  group = 2), alpha = 0.5, fill = 'red') +
  scale_y_continuous(labels = scales::percent_format())

Я уверен, что должен быть более элегантный wa y, чтобы сделать это.

Надеюсь, мне удалось объяснить свою ситуацию несколько понятно.

1 Ответ

0 голосов
/ 30 мая 2020

Из вашего вопроса я понял, что у вас есть один тип данных, для которого у вас есть отдельные случаи, и один тип данных, для которого у вас есть пропорции. Эти данные должны быть представлены на одной гистограмме.

Поскольку у меня нет образца ваших данных, я буду использовать стандартный набор данных и немного изменить его форму, чтобы отразить ваш случай.

library(tidyverse)

# Suppose df1 is the equivalent of DepriSymptoms
df1 <- mpg[mpg$year == 1999,]

# And we'll shape df2 to be similar to DepriNorm (proportion data)
df2 <- mpg[mpg$year == 2008,]
df2 <- df2 %>% group_by(class) %>% 
  summarise(n = n()) %>% 
  ungroup() %>%
  mutate(prop = n / sum(n))

head(df2)
#> # A tibble: 6 x 3
#>   class          n   prop
#>   <chr>      <int>  <dbl>
#> 1 2seater        3 0.0256
#> 2 compact       22 0.188 
#> 3 midsize       21 0.179 
#> 4 minivan        5 0.0427
#> 5 pickup        17 0.145 
#> 6 subcompact    16 0.137

Таким образом, в приведенных выше данных мы можем подсчитать случаи в df1, но должны использовать столбец prop в df2. Вы можете полностью использовать двухуровневый подход, но вы должны помнить, что слои не могут заглядывать в другие слои, и поэтому уклонение от групп полосок отсутствует. Здесь два совета:

  • Вы можете использовать geom_col() как ярлык для geom_bar(..., stat = "identity"), чтобы он не пытался подсчитывать ваши данные о пропорциях.
  • Вы можете использовать position = position_nudge(x = ...) чтобы сместить полосы так, чтобы они выглядели сгруппированными, даже если они находятся на разных слоях. Вам также придется изменить ширину полос.
ggplot(df1, aes(class)) +
  geom_bar(aes(y = after_stat(prop), group = 1, fill = "A"),
           width = 0.4, position = position_nudge(0.22)) +
  geom_col(aes(y = prop, fill = "B"), data = df2,
           width = 0.4, position = position_nudge(-0.22))

Создано 30.05.2020 представителем пакет (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...