Как добавить точки к оси x графика

#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.html

2. Я считаю, что использование цветов для представления как 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