Заполните geom_tile режимом факторной переменной или другими способами создать тепловую карту в R - PullRequest
0 голосов
/ 29 апреля 2019

Я пытаюсь создать тепловую карту в R, используя три фактора.Я хотел бы быть в состоянии заполнить цвет, используя модальную категорию одного из факторов, но я не смог выяснить, как это сделать.

Когда я пробую ggplot с geom_tile, он создает карту тепла, однако я не уверен, как он выбирает значение переменной fill.Это, конечно, не режим, потому что я проверил это.

Например, используя встроенный набор данных ChickWeight, я бы хотел, чтобы заливка основывалась на модальной (наиболее частой) категории переменной "weight_group."Я создал.

data(ChickWeight)
glimpse(ChickWeight)

ChickWeight$Time <- ifelse(ChickWeight$Time >= 10,1,0)
ChickWeight <- ChickWeight %>% mutate(weight_group = ntile(weight, 3))

ChickWeight$Diet <- as.factor(ChickWeight$Diet)
ChickWeight$Time <- as.factor(ChickWeight$Time)
ChickWeight$weight_group <- as.factor(ChickWeight$weight_group)


table(ChickWeight$Diet, ChickWeight$Time, ChickWeight$weight_group)

ggplot(data = ChickWeight, aes(x=Time, y=Diet, fill=weight_group)) + 
  geom_tile()

Result of ggplot

На основе таблицы с тремя путями нижний правый блок должен быть розового цвета (соответствует weight_group == 1) вместо зеленого как модальная категория weight_group, когда Diet == 1 & Time == 1 is weight_group == 1 (11 отсчетов).

Любая помощь по этому вопросу будет принята с благодарностью.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

Использование dplyr для подсчета наиболее частой категории weight_group для каждой комбинации Time и Diet:

ChickWeight %>% 
  group_by(Time, Diet) %>% 
  count(weight_group) %>% 
  filter(n == max(n)) %>% 
  ggplot(
    aes(x = Time,
        y = Diet,
        fill = weight_group)
    ) + 
  geom_tile()

Кстати, так как вы уже знаете dplyr::mutate, вы должны знать, что вы можете выполнить всю предварительную обработку, которую вы делаете здесь, в одном мутировании. Это значит вместо:

ChickWeight$Time <- ifelse(ChickWeight$Time >= 10,1,0)
ChickWeight <- ChickWeight %>% mutate(weight_group = ntile(weight, 3))

ChickWeight$Diet <- as.factor(ChickWeight$Diet)
ChickWeight$Time <- as.factor(ChickWeight$Time)
ChickWeight$weight_group <- as.factor(ChickWeight$weight_group)

Вы можете просто набрать:

ChickWeight <- 
  ChickWeight %>% 
  mutate(
    Time = as.factor(ifelse(Time>=10, 1 ,0)),
    Diet = as.factor(Diet),
    weight_group = as.factor(ntile(weight, 3))
  )
0 голосов
/ 29 апреля 2019

Вы можете определить функцию getMode, которая вычисляет режим вектора, используя функцию счетчика plyr для создания кадра данных счетчиков для каждого класса.Затем отсортируйте фрейм данных и получите верхнее значение.

library(plyr)
getMode <- function(vec){
  df <- plyr::count(vec) %>%
    arrange(-freq)
  return(df[1,"x"])
}

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

ChickWeight %>%
  group_by(Time, Diet) %>%
  summarize(modeWeightGroup = getMode(weight_group)) %>%
  ggplot(aes(x=Time, y=Diet, fill= modeWeightGroup)) + 
  geom_tile()

Я также не думаю, что нижний правый квадрат должен быть weight_group 1, потому что похоже, что трехсторонняя таблица уже отсортирована на основе weight_group, так что квадрат говорит о цыплятах в weight_group 1, ихМодальное время, диетическое сочетание составляет (1,1).

...