在ggtree/ggplot2中拆分图例

在ggtree/ggplot2中拆分图例,r,ggplot2,ggtree,R,Ggplot2,Ggtree,我正在使用一个名为ggtree的软件,它基于ggplot2,允许您可视化系统发育树并向其中添加元数据。将元数据添加为彩色热图的函数称为gheatmap,据我所知,它只是将data.frame或矩阵中的行名与树的标签关联起来。与之相关的其他语言基本上是ggplot2 数据如下: 通过以下代码,我生成了以下内容 我有两个主要问题: 我想把这些变量分别放在图例的标题下,这样它们就是六个独立的图例。正如你所看到的,我只把一个标题“起源”放在了它们上面。(我尝试使用上述绘图对象,而不是q1,因为在比例填充

我正在使用一个名为
ggtree
的软件,它基于
ggplot2
,允许您可视化系统发育树并向其中添加元数据。将元数据添加为彩色热图的函数称为
gheatmap
,据我所知,它只是将data.frame或矩阵中的行名与树的标签关联起来。与之相关的其他语言基本上是
ggplot2

数据如下:

通过以下代码,我生成了以下内容

我有两个主要问题:

  • 我想把这些变量分别放在图例的标题下,这样它们就是六个独立的图例。正如你所看到的,我只把一个标题“起源”放在了它们上面。(我尝试使用上述
    绘图
    对象,而不是
    q1
    ,因为
    比例填充手册
    中的
    中断
    ,但无效)

  • 我希望将
    gyrA
    下的变量
    WT
    parC
    下的
    WT
    分开处理,即在图例中各自的分类标题下有各自的方框

  • 希望解决方案没有我想象的那么复杂


    干杯。

    请制作一个简单的可复制示例来说明您的问题,并让我们测试解决方案。一种可能的方法是用您想要的图例绘制六个绘图,使用
    cowplot::get_legend
    检索它们,然后使用
    cowplot
    构建一个包含所有六个图例的绘图。我已经在github中添加了数据,以便可以复制。干杯
    library(ggtree)
    
    #read in tree
    tree <- read.tree("example_tree_overflow.tree")
    p <- ggtree(tree)
    
    #add tip labels and scale
    p <- p + geom_tiplab(size = 2.4, align = TRUE, linesize = .2) +
                          geom_treescale()
    
    #group and colour clades
    
    p <- p %>% groupClade(node=c(72,75,84)) + aes(color=group) +
      scale_color_discrete() + 
      theme(legend.position = NULL)
    
    #import data.frame and add column names
    
    meta <- read.csv("metadata_overflow.csv", stringsAsFactors = TRUE)
    rownames(meta) <- meta[,1]
    meta <- meta[,2:7]
    colnames(meta) <- c("Origin", "Syndrome", "fimH", "CTX-M","gyrA","parC")
    
    #variable to generate the breaks in the legend
    
    q1 <- c("REF","SAN","OBH","CoH",
          "Cystitis","Pyelonephritis","Sepsis",
          "H22","H30","H41",
          "CTX-M-1_15","CTX-M-9_18","CTX-M-9_27",
          "WT","S83L", "S83L_D87N",
          "WT","S80I_E84V")
    
    #colour values for the legend, sorry they're awful, I will fix them later
    
    c1 <- c("black","blue","green","red",
            "yellow","purple","firebrick",
            "turquoise","purple","olivedrab",
            "red","purple","turquoise",
            "white","purple","turquoise",
            "white", "turquoise")
    
    #assign breaks to colours
    names(c1) <- q1
    
    #draw heatmap next to tree, assigning colours correctly to the variables 
    
    gheatmap(p, meta, colnames_position = "top", width = .06, offset = .025, 
              font.size = 2, colnames_angle = 50, colnames_offset_y = .2, 
              colnames_offset_x = -0.0019, hjust = 0) + 
              theme(legend.title = element_text()) +
               scale_fill_manual(name="Origin",
                                breaks=q1, 
                                values=c1)
    
    >plots
    $Origin
    [1] "REF" "SAN" "OBH" "CoH"
    
    $Syndrome
    [1] "Cystitis" "Pyelonephritis" "Sepsis"        
    
    $fimH
    [1] "H22" "H30" "H41"
    
    $`CTX-M`
    [1] "CTX-M-1_15" "CTX-M-9_18" "CTX-M-9_27"
    
    $gyrA
    [1] "WT"        "S83L"      "S83L_D87N"
    
    $parC
    [1] "WT"        "S80I_E84V".