Есть ли более элегантный способ закрасить столбцы ggplot средним значением данных? - PullRequest
2 голосов
/ 08 марта 2020

Должен быть менее неуклюжий способ суммирования средних значений в гистограмме. Я ожидал, что заполнение вернет среднее значение для всех подсчетов. Смотрите MWE, включая обходной путь.

# Some data
Machine <- c( "A", "B", "B", "B", "B", "C","D", "E", "F", "G", "H", "I", "J", "K", "G","H", "G")
Efficiency <- c(93.3, 95.0, 95.0, 99.1, 84.1, 95.8, 91.2, 82.9, 73.1, 93.7, 86.6, 68.1, 78.5, 68.5, 86.6, 90.0, 97.3)
gt <- data.frame(Machine, Efficiency)

ggplot(gt, aes(x=Machine, fill = Efficiency)) + geom_bar()
# This is not what I expected so...

library(dplyr)
gt2 <- gt %>% group_by(Machine) %>% mutate(mean(Efficiency))
names(gt2) <- c("Machine", "Efficiency", "Mean_Efficiency")

ggplot(gt2, aes(x=Machine, fill = Mean_Efficiency)) +
    geom_bar(stat = "count") 
# This is what I want (and mistakenly expected)

Есть ли более элегантный способ окрашивания полос в соответствии со средней эффективностью?

Ответы [ 3 ]

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

Причина, по которой ваша первая попытка не дает ожидаемого результата, заключается в том, что ggplot2 не может знать, что это среднее значение Efficiency, которое вы хотите использовать для заполнения. С таким же успехом это может быть сумма или медиана, и ggplot2 прав в том, что не пытается угадать то, чего не может знать.

Итак, лучшее решение - это предварительно вычислить среднее значение. Однако ваш график опирается на две сводки: одна означает, что вы предварительно вычислили, а другая - это значения, которые вы позволяете ggplot2 (или, более конкретно, stat_count(), который используется geom_bar()) для вас. Если эта комбинация методов для кратких сводок покажется немного запутанной, и вы предпочитаете предварительно вычислять обе сводки следующим образом:

gt2 <- gt %>%
        group_by(Machine) %>%
        summarize(count = n(),
                  mean_efficiency = mean(Efficiency)) 

Затем вы можете использовать geom_col() вместо geom_bar(), поскольку первая принимает явный y -aestheti c вместо того, чтобы строить подсчеты:

ggplot(gt2, aes(x = Machine, y = count, fill = mean_efficiency)) +
  geom_col()

enter image description here

Обратите внимание, что это решение не более правильное, чем ваше. Для меня это яснее, чем ваше решение, но, конечно, это также вопрос вкуса. Вам решать, что вы предпочитаете.

2 голосов
/ 08 марта 2020

Никаких предварительных вычислений не требуется, если вы вызываете ave из aes.

ggplot(gt, aes(x=Machine, fill = ave(Efficiency,Machine))) + geom_bar()

То есть, непосредственно установите fill эстетику c как среднее значение эффективности над Машина. Для меня это гораздо более естественный и читабельный подход, но, как говорили другие, это дело вкуса.

Если вы хотите установить заголовок легенды, используйте (например) +labs(fill="Mean efficiency")

enter image description here

0 голосов
/ 08 марта 2020

Ваш подход к вычислению средств до заговора был абсолютно верным. fill не сделает это для вас. Однако ваш код может быть более кратким, не всегда задавая имена. (;

library(ggplot2)
library(dplyr)

# Some data
gt <- data.frame(
  Machine = c( "A", "B", "B", "B", "B", "C","D", "E", "F", "G", "H", "I", "J", "K", "G","H", "G"),
  Efficiency = c(93.3, 95.0, 95.0, 99.1, 84.1, 95.8, 91.2, 82.9, 73.1, 93.7, 86.6, 68.1, 78.5, 68.5, 86.6, 90.0, 97.3)
)
# aggregate(Efficiency~Machine, data=gt, FUN = mean)
gt <- gt %>% 
  group_by(Machine) %>% 
  mutate(Mean_Efficiency = mean(Efficiency)) %>% 
  ungroup() 

ggplot(gt, aes(x = Machine, fill = Mean_Efficiency)) + 
  geom_bar()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...