#r
#r
Вопрос:
Я практикую кодирование тепловой карты, я самообучаюсь, я хочу, чтобы точки с их легендой внизу графика были похожи на исходную тепловую карту (я обвел эту часть красным).
данные находятся по этой ссылке:
Небольшая информация об этих данных, похоже, что тепловая карта основана на z-балле среднего значения для 4 групп, поскольку у них две группы, я подумал, что, возможно, команда сгенерировала среднее значение для каждых двух столбцов и вывела z-балл из среднего значения для этих четырех групп. Я попробовал этот код:
library(dplyr)
library(tidyverse)
library(stringr)
library(matrixStats)
library(pheatmap)
library(heatmaps)
dfc <- read.csv(url("https://github.com/learnseq/learning/raw/main/GSE133399_Fig2_FPKM.csv"))
head(dfc)
dfg <- dfc %>% dplyr::filter(tracking_id %in% c(
"Ifng", "Igfbp7", "Il13", "Il4", "Itgb1", "Rbpj",
"Tnfsf11", "Xcl1", "Ern1", "Furin", "Il5", "Nrp1", "Ptprs",
"Spry1", "Vdr", "Foxp3", "Prdm1", "Itgb8", "Lamc1", "Ptpn5",
"Bmpr2", "Csf1", "Dst", "Myo1e", "Pmaip1", "Itgav", "Ramp1",
"Sdc4", "Areg", "Calca", "Capg", "Ccr2", "Cd44", "Il10", "Il1rl1",
"Maf", "Rora", "S100a4", "Adam8", "Adam19", "Anxa2", "Bcl2l1",
"Csda", "Ehd1", "Hist1h1b", "Id2", "Il2ra", "Il2rb", "Lgals1",
"Lmna", "Mki67", "Penk", "Podnl1", "S100a6", "Vim"))
dfg$CD44low_rep <- rowMeans(dfg[,c('CD44low_rep1', 'CD44low_rep2')], na.rm=TRUE)
dfg$CD44hi_CD69low_rep <- rowMeans(dfg[,c('CD44hi_CD69low_rep1', 'CD44hi_CD69low_rep2')], na.rm=TRUE)
dfg$CD44hi_CD69hi_CD103low_rep <- rowMeans(dfg[,c('CD44hi_CD69hi_CD103low_rep1', 'CD44hi_CD69hi_CD103low_rep2')], na.rm=TRUE)
dfg$CD44hi_CD69hi_CD103hi_rep <- rowMeans(dfg[,c('CD44hi_CD69hi_CD103hi_rep1', 'CD44hi_CD69hi_CD103hi_rep2')], na.rm=TRUE)
head(dfg)
dim(dfg)
head(dfg)
rownameshm <-paste(dfg[,1])
rownameshm
colnameshm <- paste(dQuote(colnames(dfg[0, 10:13])), collapse = ", ")
colnameshm
dfg$Mean <- rowMeans(dfg[,10:13])
dfg$sd <- rowSds(as.matrix(dfg[,10:13]))
head(dfg)
zScore <- function(p){
for(n in 10:13){
p[[n]]=(as.numeric(p[[n]])-as.numeric(p[[14]]))/as.numeric(p[[15]])
}
return(p)
}
Matrix_zScore <- t(apply(dfg,1,zScore))
head(Matrix_zScore)
Matrix_zScore_temp <- mapply(Matrix_zScore[,10:13], FUN=as.numeric)
Matrix_zScore_temp <- matrix(data=Matrix_zScore_temp, ncol=4, nrow=55)
Matrix_zScore_temp1<-as.data.frame(Matrix_zScore_temp)
rownames(Matrix_zScore_temp) <- dfg$tracking_id
plot_frame <- reshape2::melt(Matrix_zScore_temp)
library("tidyverse")
library(repr)
options(repr.plot.width=4, repr.plot.height=8)
ggplot(plot_frame, aes(Var2, Var1, fill = value))
geom_tile(color = "white", position = position_dodge(), show.legend = TRUE)
scale_y_discrete(position = "right")
labs(y = "", fill = "")
scale_fill_gradientn(colors = c("#3C57A8", "white", "#DE2D29"))
theme_minimal() theme(
legend.position = c(1, 0),
legend.justification = c(-0.9, 0),
legend.direction = "vertical",
legend.key.size = unit(0.5, "cm"),
legend.key.width = unit(0.3,"cm"))
Моя тепловая карта выглядит следующим образом:
Комментарии:
1. Я подозреваю, что исходная графика имеет два разных графика, которые выровнены вместе. Это может быть достигнуто с
cowplot
помощью библиотечнойplot_grid()
функции. wilkelab.org/cowplot/index.html2. Я считаю, что использование цветов для представления как z-оценки, так и для представления столбцов немного сбивает с толку. Я не вижу преимущества цветов вместо меток осей. Было бы целесообразно заменить числа фактическими словами образцов? Это можно сделать без перекрытия меток.
3. Полностью согласен с r2evans. Особенно синие и красные точки. Можно подумать, что они, по крайней мере, выберут неперекрывающуюся цветовую схему.
4. Я согласен @r2evans, но я пытаюсь воспроизвести фигуру.
5. Потому что вы
legend.position = c(1, 0)
заставляете его там. Удалите это, и вы сможете увидеть всю легенду.
Ответ №1:
Вы можете добавить geom_point
вызов с несколькими большими точками и цветовой эстетикой. Установите для них Var1
значение » «, чтобы они были первыми в алфавитном порядке и создавали для себя место на оси y. Это также автоматически добавит цветовую легенду, необходимую для определения оси x на тепловой карте:
ggplot(plot_frame, aes(Var2, Var1, fill = value))
geom_tile(color = "white", position = position_dodge(), show.legend = TRUE)
geom_point(data = data.frame(Var2 = 1:4, Var1 = "", value = 0), size = 5,
aes(color = factor(Var2)))
geom_point(data = data.frame(Var2 = 1:4, Var1 = " ", value = 1), alpha = 0)
scale_color_manual(values = c("black", "forestgreen", "red4", "blue4"),
labels = c("CD44 T Cells",
"CD44 CD69 T Cells",
"CD44 CD69 CD103-lo T Cells",
"CD44 CD69 CD103-hi T Cells"),
guide = guide_legend(override.aes = list(fill = NA)))
scale_fill_gradientn(colors = c("#3C57A8", "white", "#DE2D29"))
scale_y_discrete(position = "right")
labs(y = "", fill = "", color = " ", x = "")
theme_minimal()
theme(legend.justification = c(-0.9, 0),
legend.direction = "vertical",
axis.text.x = element_blank(),
legend.key.size = unit(0.5, "cm"),
legend.key.width = unit(0.3,"cm"),
axis.text.y = element_text(face = "italic"),
panel.grid = element_blank())
Комментарии:
1. Большое вам спасибо @AllanCameron ! могу ли я обсудить это в чате, если у вас есть время? Мне нужна дополнительная помощь.
2. Я попробовал ваш код, он работал хорошо, но по какой-то причине я потерял сортировку, я использовал match(rev ()), чтобы избежать автоматической сортировки, но теперь у меня такая же проблема после того, как я попробовал ваш код (который я считаю отличным), но есть идеи, как исправить эту проблему? также как изменить положение новой легенды? Я обновлю сообщение новым кодом. @AllanCameron