Многочисленные легенды заполнения для каждой переменной в тепловой карте - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть входной файл file1.txt:

V1          V2      Score
rs4939134   SIFT    1
rs4939134   Polyphen2   0
rs4939134   MutationAssessor    -1.75
rs151252290 SIFT    0.101
rs151252290 Polyphen2   0.128
rs151252290 MutationAssessor    1.735
rs12364724  SIFT    0
rs12364724  Polyphen2   0.926
rs12364724  MutationAssessor    1.75
rs34448143  SIFT    0.005
rs34448143  Polyphen2   0.194
rs34448143  MutationAssessor    0.205
rs115694714 SIFT    0.007
rs115694714 Polyphen2   1
rs115694714 MutationAssessor    0.895

И это мой код R для построения этой таблицы в виде тепловой карты:

library(ggplot2)

mydata <- read.table("file7.txt", header = FALSE, sep = "\t")
names(mydata) <- c("V1", "V2", "Score") 

ggplot(data = mydata, aes(x = V1, y = V2, fill = Score)) + 
  geom_tile() + 
  geom_text(aes(V1, V2, label = Score), color = "black", size = 3) + 
  scale_fill_continuous(type = "viridis", limits = c(-5.76, 5.37)) + 
  labs(x = "pic1", y = "") + 
  theme_bw()
  theme(panel.border = element_rect(colour = "black"),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(), 
        axis.line = element_line(colour = "black"),
        axis.text = element_text(size = 4))

И этот график я получил:

enter image description here

мне нужно для каждой строки (каждого типа в V2) мне нужно поставить легенду, которая представляет, так что в конце будет3 легенды, каждая из которых (одна для SIFT, вторая для Polyphen и третья для MutationAssessor) с различным диапазоном, который я могу указать.

например: SIFT из (0,1) и Polyphen из (0,1) и MutationAssessor из (-6,6)

Я пробовал разные вещи из предыдущих заданных вопросов, но ничего не помогало мне.

Я ценю любую помощь.

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Вы можете зациклить три заданные переменные и построить разные графики для каждой из них.В конце концов вы должны объединить их.

Создать набор данных с требуемыми пределами:

myLimits <- list(
    list("SIFT", 0, 1),
    list("Polyphen2", 0, 1),
    list("MutationAssessor", -6, 6)
)

Функция для построения тепловой карты только для одной переменной за раз:

plotHeat <- function(type, MIN, MAX) {
    library(ggplot2)
    p <- ggplot(subset(mydata, V2 == type), 
                aes(V1, V2, fill = Score, label = Score)) + 
        geom_tile() + 
        geom_text(color = "black", size = 3) + 
        scale_fill_continuous(type = "viridis", limits = c(MIN, MAX)) + 
        labs(x    = "SNP", 
             y    = NULL,
             fill = type) + 
        theme_bw()
    # Output x-axis only for the last plot
    if (type != myLimits[[length(myLimits)]][[1]]) {
        p <- p + theme(axis.text.x = element_blank(),
                       axis.title.x = element_blank(),
                       axis.line.x = element_blank(),
                       axis.ticks.x = element_blank())
    }
    return(p)
} 

Составьте и объедините участки, используя пакет egg:

res <- lapply(myLimits, function(x) {plotHeat(x[[1]], x[[2]], x[[3]])})
egg::ggarrange(plots = res)

enter image description here

0 голосов
/ 12 сентября 2018

Это может быть связано с этим .

xs <- split(mydata, f = mydata$V2)

p1 <- ggplot(data = xs$MutationAssessor, aes(x = V1, y = 0, fill = Score)) + 
  geom_tile() + 
  geom_text(aes(label = Score), color = "black", size = 3) + 
  scale_fill_continuous(type = "viridis", limits = c(-5.76, 5.37)) + 
  labs(x = "pic1", y = "") + 
  facet_grid(V2 ~ .) + 
  theme_bw() + 
  theme(panel.border = element_rect(colour = "black"), 
        panel.grid.major = element_blank(),   
        panel.grid.minor = element_blank(), 
        axis.line = element_line(colour = "black"),
        axis.text = element_text(size = 4))

p2 <- p1 %+% xs$Polyphen2
p3 <- p1 %+% xs$SIFT

library(gridExtra)
grid.arrange(p1, p2, p3)

И результат:

enter image description here

EDIT:

Если вам нужен другой диапазон для facets, но вы хотите, чтобы значения были сопоставимы (например, значение около 5 должно быть желтым на всех графиках), существует возможное решение

Сначала опишите вашу fill переменную

mydata$colour <- cut(mydata$Score, 
                     quantile(mydata$Score, c(0, 0.25, 0.5, 0.75, 1)), 
                     include.lowest = T)

Затем создайте сюжеты:

xs <- split(mydata, f = mydata$V2)

p1 <- ggplot(data = xs$MutationAssessor, aes(x = V1, y = 0, fill = colour)) + 
  geom_tile() + 
  geom_text(aes(label = Score), color = "black", size = 3) + 
  labs(x = "pic1", y = "") + 
  facet_grid(V2 ~ .) + 
  theme_bw() + 
  theme(panel.border = element_rect(colour = "black"), 
        panel.grid.major = element_blank(),   
        panel.grid.minor = element_blank(), 
        axis.line = element_line(colour = "black"),
        axis.text = element_text(size = 4))

p2 <- p1 %+% xs$Polyphen2
p3 <- p1 %+% xs$SIFT

И, наконец, изменить палитру:

mypalette <- c("#FFFFCC", "#A1DAB4", "#41B6C4", "#2C7FB8", "#253494")
names(mypalette) <- levels(mydata$colour)

p1 <- p1 + scale_fill_manual(values = mypalette[levels(xs$MutationAssessor$colour)]) 
p2 <- p2 + scale_fill_manual(values = mypalette[levels(xs$Polyphen2$colour)]) 
p3 <- p3 + scale_fill_manual(values = mypalette[levels(xs$SIFT$colour)]) 

И результат:

grid.arrange(p1, p2, p3)

enter image description here

...