Как мне назначить 9 столбцов определенных цветов независимого градиента на моей тепловой карте? - PullRequest
0 голосов
/ 21 мая 2019

У меня есть файл, который содержит следующий фрагмент, за исключением 3000 записей разных животных и группы крови

Файл A

Animal Bloodtype Count
Horse  Opos      10
Horse  Apos      5
Horse  Bpos      4
Horse  ABpos     5
Horse  Oneg      6
Horse  Aneg      7
Horse  Bneg      9
Horse  ABneg     10
Horse  Unknown   10
Cat    Opos      12
Cat    Apos      15
Cat    Bpos      14
Cat    ABpos     15
Cat    Oneg      16
Cat    Aneg      17
Cat    Bneg      19
Cat    ABneg     14
Cat    Unknown   14
Dog    Opos      9
Dog    Apos      23
Dog    Bpos      12
Dog    ABpos     42
Dog    Oneg      45
Dog    Aneg      23
Dog    Bneg      45
Dog    ABneg     32
Dog    Unknown   32
Mouse  Opos      3
Mouse  Apos      4
Mouse  Bpos      5
Mouse  ABpos     3
Mouse  Oneg      6
Mouse  Aneg      8
Mouse  Bneg      8
Mouse  ABneg     20
Mouse  Unknown   20
Pig    Opos      19
Pig    Apos      13
Pig    Bpos      22
Pig    ABpos     32
Pig    Oneg      25
Pig    Aneg      13
Pig    Bneg      35
Pig    ABneg     22
Pig    Unknown   22

Я пытаюсь создать тепловую карту, где моя ось Yживотные, тип крови по оси X и значения в качестве значений.

Я пытаюсь покрасить каждый столбец независимо по типу крови своим собственным специфическим цветом и восходящим градиентом на столбец, чтобы легко определить, какое животное имеет высокое количество O-положительныхили A-положительный и т. д. и то, что у животных иссякает из-за уменьшения градиента ... и т. д. (потому что типы крови имеют цветовую кодировку для легкой визуализации)

По сути, я пытался сделать что-то вроде того, что было сделано вэтот вопрос о стеке потока: тепловые карты ggplot2: использование разных градиентов для категорий

или этот, но разные цвета в строке: тепловая карта на столбец с ggplot2

csv_file<-read.csv("~/Documents/FileA.csv")

csv_file.s <- ddply(csv_file, .(Bloodtype), transform, rescale = scale(Count))

csv_file.s$Category <- csv_file.s$Bloodtype

levels(csv_file.s$Category) <- 
  list("Opos" = c("Opos"),
       "Apos" = c("Apos"),
       "Bpos" = c("Bpos"),
       "ABpos" = c("ABpos"),
       "Oneg" = c("Oneg"),
       "Aneg" = c("Aneg"),
       "Bneg" = c("Bneg"),
       "Oneg" = c("Oneg"),
       "Unknown" = c("Unknown"))

csv_file.s$rescaleoffset <- csv_file.s$rescale + 100*(as.numeric(as.factor(csv_file.s$Category))-1)
scalerange <- range(csv_file.s$rescale)
gradientends <- scalerange + rep(c(0,100,200), each=8)
colorends <- c("white", "Aquamarine4", "white", "yellow4", "white", "turquoise4","white","orange4", "white", "slategray4","white","seagreen4","white","purple4","white","red4","white","blue4")


ggplot(csv_file.s, aes(Bloodtype, Animal)) + 
  geom_tile(aes(fill = rescaleoffset), colour = "transparent") + 
  scale_fill_gradientn(colours = colorends, 
                       values = rescale(gradientends)) + 
  scale_x_discrete("", expand = c(0, 0))+ 
  scale_y_discrete("", expand = c(0, 0)) +
  theme(panel.background = element_rect(fill = 'white'))
  theme_grey(base_size = 12) + 
  theme(legend.position = "none",
        axis.ticks = element_blank(), 
        axis.text.x = element_text(angle = 330, hjust = 0))

Но градиент получается неправильным, а цвета повсюду.Я пытался найти, как назначить цвета для конкретных заголовков столбцов в тепловой карте, т.е. Unknown = "blue4", ABneg = "red4", но безрезультатно.По сути, я не знаю, что я делаю.:(

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

1 Ответ

1 голос
/ 22 мая 2019

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

Предположим, df - это ваш фрагмент данных в формате data.frame:

ggplot(df, aes(x = Bloodtype, y = Animal, fill = Bloodtype, alpha = Count)) +
  # Dummy tile geom for white background
  geom_tile(fill = "white", alpha = 1) +
  geom_tile() +
  scale_alpha_continuous(breaks = seq(0, max(df$Count), length.out = 10), 
                         limits = c(0, NA))

enter image description here

Возможно, вам придется немного покопаться с перерывами и ограничениями в шкале альфа, чтобы соответствовать вашим данным. Конечно, вы можете выбрать любые цвета для заливки, добавив scale_fill_*() к графику.

...