根据函数变量的值有条件地将图层添加到 ggplot

Add layers conditionally to a gglplot depending on the value of a function variable

我正在尝试制作一个 ggplot 散点图,它根据提供给函数 tsnePlotSubclusterfeature 选项添加三层之一:

feature = c("subcluster" , "area" , "age")

如果feature == "subcluster",添加的层应该绘制属于指定子簇的点(单元格)。

如果feature == "area",添加的图层应该绘制属于指定子集群的相同图层,但这次按它们的面积着色。

如果feature == "age",添加的图层应该绘制属于指定子集群的相同图层,但这次按它们的面积着色。

我可以在 3 个不同的函数中执行此操作,但是当我尝试使用 if 语句将它们添加到一个函数中时,出现以下错误:

tsne.clust <- tsnePlotSubcluster(subclust = "cluster_2", feature = "area")

Error: Cannot add ggproto objects together. 
Did you forget to add this object to a ggplot object?

df 看起来像这样:(下面的 reprex)

                   cell.name      tSNE_1      tSNE_2 nGene Age          area subcluster.merge
18513 TCAGCAATCCCTCAGT_235875  17.1932545  20.9951805   994  25      parietal       cluster_23
45195  CACATTTAGTGTACCT_55869   2.0990437  -3.1644088   605  14         motor       cluster_16
437    ACTGCTCAGCTGGAAC_60204  14.3391798   5.7986418   919  17     occipital    cluster_12-35
47652  TTGAACGAGCGGCTTC_24246  -2.4054652  -5.7217611   617  17         motor       cluster_16
3079   CTGAAGTGTCCGAGTC_36162  13.3077568  -9.8810075  2360  19      parietal    cluster_10-34
73692  TACGGTATCCACGTTC_43045  -3.9540697 -22.1901588   757  25        insula cluster_19-20-40
78111  ACGGGTCAGGAGTTGC_52675  -8.2138674  -5.6368533   680  14         motor       cluster_11
77792  TTGAACGGTCTAGAGG_46399  -4.8505234 -17.3649528  1495  25        insula cluster_19-20-40
80576  ACGAGGACACCCAGTG_43377   4.7608973  12.3166870   652  17           PFC       cluster_27
40102 CTAGCCTTCGGATGTT_108090 -26.0839271  -6.0513843  2877  18     occipital       cluster_17
75778 GAATGAATCGAACGGA_122697  -0.8466168 -21.6881664   681  25           PFC cluster_19-20-40
64808 CTGGTCTCAGTCCTTC_220448   1.4123929  23.1787489  1275  25      parietal       cluster_21
31050 CGATGGCGTCGCCATG_107147  12.7008032 -23.3682646  1457  25      temporal     cluster_5-24
40011 AAGGCAGCAAGCCCAC_103547 -15.8308776  -9.0420539  2830  18     occipital       cluster_15
23802 TTAGGCACATCGGTTA_224119  25.8490750   5.6472168  2354  25      parietal     cluster_7-39
55771  CGGAGTCGTGACGCCT_22310  -0.1658289   9.2474600   920  22         motor       cluster_13
62142 TAGAGCTAGGTGACCA_270328  -1.8325109 -12.8780762  2493  25     cingulate        cluster_4
85340 AGGTCATCAAGCGATG_108496 -18.5638069  19.3544782  1054  20         motor       cluster_21
31185 TGGCCAGGTGCTGTAT_271635   5.3272499 -19.8372034  1557  25     cingulate       cluster_29
496    AGAGTGGGTTGTGGCC_10259  11.5646170  11.4089743  1549  18   hippocampus        cluster_8
2513   GATCTAGTCCAAGCCG_14125   7.6368712  11.6917014  1756  19         motor        cluster_8
52795  TACACGATCAGTCCCT_43422  -0.8565756  12.8355195  1534  20           PFC       cluster_13
44355  TCTATTGGTCACAAGG_44401 -21.1689622  -8.1854890  1382  25        insula        cluster_1
96327 GATCTAGTCGCTTAGA_232432 -26.6976718  10.3691109   877  25      parietal     cluster_3-33
41100  GTTACAGGTATGAAAC_43797 -21.6719857   0.6879885  1489  19 somatosensory     cluster_3-33

我尝试将所有 3 个选项合并到绘图中的函数是:

tsnePlotSubcluster <- function(feature = "subcluster", # can be area, age, subcluster
                               subclust = "cluster_1",
                               size.grey = 0.25, 
                               size.color = 0.3
                               ) {

  # params <- plot.params[[celltype]]
  # cluster.colors <- color.values[[celltype]]$i

   p <- ggplot(tsne.meta) + 

     # Plot cells in all other subclusters in grey.
       geom_point(data = filter(tsne.meta, ! subcluster.merge == subclust),
                  aes(tSNE_1, tSNE_2, alpha = nGene), 
                  colour = "grey90", size = size.grey) +

        # a) Highlight subcluster:
        # Plot cells from selected subcluster in color.
        {if(feature == "subclust")
            geom_point(data = filter(tsne.meta, subcluster.merge == subclust), 
                  aes(tSNE_1, tSNE_2, color = nGene, alpha = nGene),
                  size = size.color) + 
            theme(legend.position = 'none') +
            scale_color_viridis_c(option = "plasma", begin = 0.1, end = 0.6)} +

        #  b) Color subcluster cells by age:
         {if(feature == "age")
             geom_point(data = filter(tsne.meta, subcluster.merge == subclust), 
                      aes(tSNE_1, tSNE_2, color = Age, alpha = nGene),
                      size = size.color) + 
             scale_color_viridis_d(option = "plasma") +
             theme(legend.position = 'top')} +

         #  c) Color subcluster cells by area:
         {if(feature == "area")
             geom_point(data = filter(tsne.meta, subcluster.merge == subclust), 
                      aes(tSNE_1, tSNE_2, color = area, alpha = nGene),
                      size = size.color) + 
             scale_color_viridis_d(option = "viridis") +
             theme(legend.position = 'top')} +

  labs(title = paste(celltype, "|", subclust)) +

  theme(plot.subtitle = element_text(color="grey18", size=11, family="Helvetica", face = "plain", hjust = 0.5),
        plot.title = element_text(color="grey18", size=12, family="Helvetica", face = "plain"),
        axis.title = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        axis.line = element_blank(),
        panel.background = element_blank(),
        panel.grid = element_blank()
    )

   return(p)
   # png(paste0("tSNE_", celltype, "_", subclust,".png"), height = 5, width = 6, units = 'in', res = 300)
   # print(p)
   # dev.off()
}

代表:

df <- 

data.frame(stringsAsFactors=FALSE,
          cell.name = c("TCAGCAATCCCTCAGT_235875", "CACATTTAGTGTACCT_55869",
                        "ACTGCTCAGCTGGAAC_60204", "TTGAACGAGCGGCTTC_24246",
                        "CTGAAGTGTCCGAGTC_36162", "TACGGTATCCACGTTC_43045",
                        "ACGGGTCAGGAGTTGC_52675", "TTGAACGGTCTAGAGG_46399",
                        "ACGAGGACACCCAGTG_43377", "CTAGCCTTCGGATGTT_108090",
                        "GAATGAATCGAACGGA_122697", "CTGGTCTCAGTCCTTC_220448",
                        "CGATGGCGTCGCCATG_107147", "AAGGCAGCAAGCCCAC_103547",
                        "TTAGGCACATCGGTTA_224119", "CGGAGTCGTGACGCCT_22310", "TAGAGCTAGGTGACCA_270328",
                        "AGGTCATCAAGCGATG_108496", "TGGCCAGGTGCTGTAT_271635",
                        "AGAGTGGGTTGTGGCC_10259", "GATCTAGTCCAAGCCG_14125",
                        "TACACGATCAGTCCCT_43422", "TCTATTGGTCACAAGG_44401",
                        "GATCTAGTCGCTTAGA_232432", "GTTACAGGTATGAAAC_43797"),
             tSNE_1 = c(17.1932545445726, 2.09904373658087, 14.3391798285586,
                        -2.40546521130513, 13.3077567635534, -3.95406970706742,
                        -8.21386742612947, -4.85052336705468, 4.7608973116436,
                        -26.0839270936647, -0.846616803167701, 1.41239293190578,
                        12.7008032319829, -15.8308775924386, 25.8490750248658,
                        -0.165828934667098, -1.83251089783584, -18.5638068984438,
                        5.32724992630323, 11.5646169818198, 7.63687124491221,
                        -0.856575609921843, -21.168962152839, -26.6976718473189,
                        -21.6719856501443),
             tSNE_2 = c(20.9951805427067, -3.16440882112687, 5.79864177543435,
                        -5.7217611348367, -9.88100746982017, -22.1901588447411,
                        -5.63685325798171, -17.3649528368626, 12.3166870135148,
                        -6.05138433224201, -21.6881664091744, 23.1787488609378,
                        -23.3682646369907, -9.04205394614397, 5.64721677110778,
                        9.24746000688929, -12.8780761893534, 19.3544781941349,
                        -19.8372034367375, 11.4089743263254, 11.6917014190321,
                        12.8355194625476, -8.18548902054804, 10.3691108842176,
                        0.687988510819477),
              nGene = c(994L, 605L, 919L, 617L, 2360L, 757L, 680L, 1495L, 652L,
                        2877L, 681L, 1275L, 1457L, 2830L, 2354L, 920L, 2493L,
                        1054L, 1557L, 1549L, 1756L, 1534L, 1382L, 877L, 1489L),
                Age = c(25L, 14L, 17L, 17L, 19L, 25L, 14L, 25L, 17L, 18L, 25L,
                        25L, 25L, 18L, 25L, 22L, 25L, 20L, 25L, 18L, 19L, 20L,
                        25L, 25L, 19L),
               area = c("parietal", "motor", "occipital", "motor", "parietal",
                        "insula", "motor", "insula", "PFC", "occipital", "PFC",
                        "parietal", "temporal", "occipital", "parietal",
                        "motor", "cingulate", "motor", "cingulate", "hippocampus",
                        "motor", "PFC", "insula", "parietal", "somatosensory"),
   subcluster.merge = c("cluster_23", "cluster_16", "cluster_12-35",
                        "cluster_16", "cluster_10-34", "cluster_19-20-40",
                        "cluster_11", "cluster_19-20-40", "cluster_27", "cluster_17",
                        "cluster_19-20-40", "cluster_21", "cluster_5-24",
                        "cluster_15", "cluster_7-39", "cluster_13", "cluster_4",
                        "cluster_21", "cluster_29", "cluster_8", "cluster_8",
                        "cluster_13", "cluster_1", "cluster_3-33", "cluster_3-33")
)

尝试将层附加到 ggplot 对象而不是一个大表达式。通过这种方式,您可以添加一些关于要添加哪些层的逻辑。请注意,如果没有 tsne.meta.

我无法真正测试它
tsnePlotSubcluster <- function(feature = "subcluster", # can be area, age, subcluster
                               subclust = "cluster_1",
                               size.grey = 0.25, 
                               size.color = 0.3) {

  # params <- plot.params[[celltype]]
  # cluster.colors <- color.values[[celltype]]$i

  p <- ggplot(tsne.meta) + 

    # Plot cells in all other subclusters in grey.
    geom_point(data = filter(tsne.meta, ! subcluster.merge == subclust),
               aes(tSNE_1, tSNE_2, alpha = nGene), 
               colour = "grey90", size = size.grey)

  # a) Highlight subcluster:
  # Plot cells from selected subcluster in color.
  if(feature == "subclust") {
    p <- p + geom_point(data = filter(tsne.meta, subcluster.merge == subclust), 
                        aes(tSNE_1, tSNE_2, color = nGene, alpha = nGene),
                        size = size.color) + 
      theme(legend.position = 'none') +
      scale_color_viridis_c(option = "plasma", begin = 0.1, end = 0.6)
  }
  #  b) Color subcluster cells by age:
  else if(feature == "age") {
    p <- p + geom_point(data = filter(tsne.meta, subcluster.merge == subclust), 
                        aes(tSNE_1, tSNE_2, color = Age, alpha = nGene),
                        size = size.color) + 
      scale_color_viridis_d(option = "plasma") +
      theme(legend.position = 'top')
  }

  #  c) Color subcluster cells by area:
  else if(feature == "area") {
    p <- p + geom_point(data = filter(tsne.meta, subcluster.merge == subclust), 
                        aes(tSNE_1, tSNE_2, color = area, alpha = nGene),
                        size = size.color) + 
      scale_color_viridis_d(option = "viridis") +
      theme(legend.position = 'top')
  }

  p <- p + labs(title = paste(celltype, "|", subclust)) +

    theme(plot.subtitle = element_text(color="grey18", size=11, family="Helvetica", face = "plain", hjust = 0.5),
          plot.title = element_text(color="grey18", size=12, family="Helvetica", face = "plain"),
          axis.title = element_blank(),
          axis.text = element_blank(),
          axis.ticks = element_blank(),
          axis.line = element_blank(),
          panel.background = element_blank(),
          panel.grid = element_blank()
    )

  return(p)
  # png(paste0("tSNE_", celltype, "_", subclust,".png"), height = 5, width = 6, units = 'in', res = 300)
  # print(p)
  # dev.off()
}

您可能还想看看 programmatic aes