тепловая карта в ggplot, разный цвет для каждой группы - PullRequest
0 голосов
/ 14 мая 2018

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

## dummy data -----------------------------------------------------------------------------
data <- data.frame(
  group = sample(c("Direct Patient Care", "Indirect Patient Care", "Education", "Rounds", "Handoff", "Misce"), 30, replace = T),
  pct = rnorm(30, mean = 50, sd = 8)
)

## generate group id 
data <- data %>%
  group_by(group) %>%
  mutate(id = row_number())

data$grpid <- with(data, ifelse(group == "Direct Patient Care", 1, ifelse(group == "Indirect Patient Care", 2,
                                                                        ifelse(group == "Education", 3, 
                                                                               ifelse(group == "Rounds", 4,
                                                                                      ifelse(group == "Handoff", 5,6 ))))))

## draw graph ------------------------------------------------------------------------------                                                                                                                                                                           
library(ggplot2)

p <- ggplot(data, aes(x=id, y=group, fill = pct)) +
  theme(panel.background = element_rect(fill = "white", colour = "grey50"), aspect.ratio = 0.4) +
  theme(panel.grid.major = element_blank(),  
        panel.grid.minor = element_blank()
  )+
  # guides(fill = guide_legend("Time, %")) +
  geom_tile() +
  scale_x_continuous (name = " ", breaks = seq(1, 8, by = 1)) +
  scale_y_discrete(name = " ") +
  theme(axis.text.x = element_text(angle = 0,hjust = 1,vjust = 1), plot.title = element_text(hjust = 0.5) ) +
  ggtitle("Heatmap of time spent doing activities across 194 shifts")


p + scale_fill_gradient2(low = "white", high = "red", limits = c(0, 80), breaks = c(0, 10, 20, 30, 40, 50, 60, 70), guide = guide_legend("Time, %"))  ## change the color theme ##

И полученная цифра выглядит так: enter image description here

Как я могу изменить цветовую тему для каждой группы, например, красный для «Раундов», синий для «Misce», зеленый для «Handoff» и т. Д ...

Большое спасибо!

1 Ответ

0 голосов
/ 15 мая 2018

Вы можете сделать это, создав свою собственную измененную величину в ваших данных, а затем слегка «взломав» эстетику alpha в сочетании с эстетикой fill:

library(tidyverse)

data %>%
  group_by(group) %>%
  mutate(rescale = scales::rescale(pct)) %>%
  ggplot(., aes(x = factor(id), y = group)) +
  geom_tile(aes(alpha = rescale, fill = group), color = "white") +
  scale_alpha(range = c(0.1, 1))

Сначала мы создаем новый столбец с именем rescale, который rescales с pct с 0 до 1, затем вы вводите scale_alpha(range = c(0, 1)) [примечание, в данном случае я использовал c(0.1, 1), чтобы вы все еще может "видеть" нулевые точки.

Наконец, вы, вероятно, хотите удалить направляющие:

data %>%
  group_by(group) %>%
  mutate(rescale = scales::rescale(pct)) %>%
  ggplot(., aes(x = factor(id), y = group)) +
  geom_tile(aes(alpha = rescale, fill = group), color = "white") +
  scale_alpha(range = c(0.1, 1)) +
  theme(legend.position = "none")

Plot

N.B. используя aes(x = factor(id)..., вы можете обойти ручную настройку x-axis, так как в этом случае кажется, что вы хотите рассматривать его как коэффициент, а не числовую шкалу.

Наконец, если вы действительно хотите получить фантазию, вы можете дважды кодировать цвета axis.text.y в соответствии с уровнями вашей переменной factor (т.е. data$group):

data %>%
  group_by(group) %>%
  mutate(rescale = scales::rescale(pct)) %>%
  ggplot(., aes(x = factor(id), y = group)) +
  geom_tile(aes(alpha = rescale, fill = group), color = "white") +
  scale_alpha(range = c(0.1, 1)) +
  theme(legend.position = "none",
        axis.text.y = element_text(color = scales::hue_pal()(length(levels(data$group)))),
        axis.ticks = element_blank()) +
  labs(x = "", y = "")

Fancy Plot

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