Есть ли способ показать, что среднее значение группы находится на нуле? - PullRequest
1 голос
/ 12 марта 2020

Я пытаюсь сделать быстрый график, чтобы показать средства нескольких групп. Мой y axis колеблется от -2 до +2. У двух моих групп среднее значение равно нулю, поэтому на графике ничего не отображается. Есть ли хороший способ изобразить два средства в нуле? Ноль является значимым числом. Я думал как маленький розовый бар или синий бар.

Есть предложения? Заранее извините за грязный код!

conseq_summary_table=structure(list(age_group = c("4", "4", "5", "5", "adult", "adult"), 
condition_motive = c("bad", "good", "bad", "good", "bad", "good"), 
group_conseq_mean = c(0, 0.192307692307, 0.133333333333, 
   -0.0333333333333, -0.710526315789, 0), 
conseq_sd = c(0.577350269189, 0.722797272709, 
   0.549891764241,0.611399643285, 0.450795268685, 0)), 
row.names = c(NA, -6L), 
class = c("grouped_df", "tbl_df", "tbl", "data.frame"), 
groups = structure(list(age_group = c("4", "5", "adult"), 
 .rows = list(1:2, 3:4, 5:6)), row.names = c(NA, -3L), 
 class = c("tbl_df", "tbl", "data.frame"), .drop = TRUE))

Вот мой текущий код:

    ggplot(conseq_summary_table, aes(age_group, conseq_mean )) +
      geom_bar(aes(fill = condition_motive), stat = "identity", position = "dodge",
               alpha = .7) +
      labs(title = "Summary of conseq", x = "Age Group", y = "Average conseq" ) +
        theme_minimal() +
      scale_y_continuous(expand = c(0,0),
                         limits = c(-2,2)) +
      geom_hline(yintercept=0)

Bar plot

1 Ответ

3 голосов
/ 24 марта 2020

Я знаю, что это не совсем моя сфера, но могу ли я позволить себе некоторые комментарии к вашему графику?

  • Для того, что вы хотите показать, гистограммы не подходят . Я думаю, что одна из причин, по которой вы боролись с этой визуализацией, именно из-за этого. Если вы хотите показать среднее значение и стандартное отклонение, гораздо более подходящей визуализацией являются точки с ошибками.
  • По возможности рассчитывайте сводную статистику в ggplot2 ! Часто нет необходимости предварительно обрабатывать ваши данные. Теперь, очевидно, есть несколько причин, по которым вы можете не иметь этих данных. Иногда нельзя обойтись предварительной обработкой. Но если у вас должен быть доступ к необработанным данным, ваш случай будет отличным примером для использования сводной статистики, такой как вышеупомянутые или рамочные графики.
  • Подумайте об использовании фасетов! Визуальное разделение данных помогает читателю во многом определить закономерности и «увидеть историю». Ваша задача - найти лучший аспект для визуализации!
  • Не используйте ограничения осей, которые не имеют смысла! В вашем случае, придерживайтесь 1, а не 2. На самом деле, ggplot часто выбирает очень разумные пределы - так что вы возможно, не нужно указывать лимиты вообще! И если вы ограничиваете свои оси, лучше всего сделать это в coord_...() звонках
  • Цветами по умолчанию является один большой недостаток ggplot2 Однако, существует интегрированный набор цветовых палитр на основе https://colorbrewer2.org- Вы можете выбрать палитры для дальтоников и др. c.

Ниже приведено предложение о том, как я мог бы построить это на основе приведенных выше комментариев:

library(ggplot2)

conseq_summary_table <- structure(list(age_group = c("4", "4", "5", "5", "adult", "adult"), condition_motive = c("bad", "good", "bad", "good", "bad", "good"), group_conseq_mean = c(0, 0.192307692307, 0.133333333333, -0.0333333333333, -0.710526315789, 0), conseq_sd = c(0.577350269189, 0.722797272709, 0.549891764241,0.611399643285, 0.450795268685, 0)), row.names = c(NA, -6L), class = c("grouped_df", "tbl_df", "tbl", "data.frame"), groups = structure(list(age_group = c("4", "5", "adult"), .rows = list(1:2, 3:4, 5:6)), row.names = c(NA, -3L), class = c("tbl_df", "tbl", "data.frame"), .drop = TRUE))

ggplot(conseq_summary_table, aes(age_group, group_conseq_mean )) +
  geom_hline(yintercept=0) +
  geom_pointrange(aes(ymin= group_conseq_mean - conseq_sd, 
                      ymax = group_conseq_mean + conseq_sd, color = condition_motive),
                  position = position_dodge(width = 1)) +
  scale_color_brewer(palette = 'Set1') +
  scale_y_continuous() +
  facet_wrap(~ age_group, scales = 'free_x') # maybe try facetting by condition_motive instead

Создано в 2020-03- 24 Представить пакет (v0.3.0)

...