将树形图转换为ggplot

时间:2017-03-17 20:27:51

标签: r ggplot2 treemap

好消息:我可以使用treemap包创建漂亮的树形图。

数据:

forTm <- structure(list(
  UnitGroup = c("1N", "BHU", "CSU", "ED", "Med/Surg", "Med/Surg", "Telemetry", 
            "Telemetry", "Telemetry", "Telemetry", "Telemetry"), 
  Unit = c("A", "B", "C", "ED", "D", "E", "F", "G", "H", "I", "J"),
  Count = c(1L, 1L, 1L, 1L, 15L, 10L, 5L, 2L, 3L, 8L, 4L)), 
  class = c("data.frame"), 
  row.names = c(NA, -11L),
  .Names = c("UnitGroup", "Unit", "Count"))

树形图:

library(treemap)
tm <- treemap(forTm,
          index = c("UnitGroup", "Unit"),
          vSize = "Count",
          vColor = "Count",
          type = "dens",
          palette = "YlGnBu",
          title = "# Patients Sample Title",
          aspRatio = (1.5),
          fontsize.labels = c(16, 12),
          fontsize.title = 16,
          bg.labels = "white",
          border.lwds = c(5,0))

问题:class(tm)是一个列表,我需要在一个包含几个ggplots的页面上绘制树形图。我预计需要为最终用户添加/重新排列图表,所以我想要一个相对灵活的解决方案。

目标:将树形图插入以下仪表板:

#just stand-ins for the plots
samplePlot <- grid.rect(gp = gpar(fill = "grey")) 
treemapHere <- grid.rect(gp = gpar(fill = "blue")) 

grid.arrange(samplePlot, # plot 1
         treemapHere, # plot 2
         samplePlot, # plot 3
         layout_matrix = rbind(c(3, 2), c(1, 1)),
         top = textGrob("Sample Title", 
                        gp = gpar(margin = margin(10, 0, 10, 0))),
         heights = c(5, 5))

但解决方案需要足够灵活,以便我可以轻松添加/重新排列图表,例如:

grid.arrange(samplePlot, # plot 1
         samplePlot, # plot 2
         samplePlot, # plot 3
         samplePlot, # plot 4
         treemapHere, # plot5
         layout_matrix = rbind(c(1, 2, 3), 
                               c(4, 5, 5)),
         top = textGrob("Sample Title", 
                        gp = gpar(margin = margin(10, 0, 10, 0))),
         heights = c(5, 5))

理想情况下,我找到了一种将树形图重新创建为ggplot的方法,因为我非常熟悉ggplot的语法,因此我可以轻松地标准化工作表&#39 ; s风格。但是,如果没有办法做到这一点,我会接受任何解决方案(将树形图保存为grob?),这样我就可以在ggplots页面中轻松重新排列这个图形。

到目前为止我做过的尝试:老实说,并不多。谷歌还没有成为我的朋友。我发现的唯一建议是使用treemapify,我无法为此特定项目执行此操作。

1 个答案:

答案 0 :(得分:2)

如果使用ggplot逐步重建树形图怎么办? E.g。

library(tidyverse)
treemapHere <- ggplot(tm$tm, 
   aes(xmin=x0+w, xmax=x0, ymin=y0+h, ymax=y0, fill=ifelse(level==1, NA, color), fill = vSize)) + 
  scale_fill_identity() + 
  geom_rect(aes( size=I((2:1)[level])), color="#303030") + 
  coord_fixed(0.75) + 
  guides(size="none") + 
  cowplot::theme_nothing() + 
  geom_text(aes(x0+w/2, y0+h/2, label=Unit, size=I(scales::rescale(vSize, c(2.5, 3))))) + 
  geom_label(aes(x, y, label=UnitGroup, size=I(scales::rescale(vSize, c(2.5, 7)))), tm$tm %>% group_by(UnitGroup) %>% summarise(x=mean(x0+w/2), y=mean(y0+h/2), vSize=mean(vSize)), inherit.aes=F, fill="white", fontface = "bold")

library(grid)
library(gridExtra)
samplePlot <- grid.rect(gp = gpar(fill = "grey"))   
grid.arrange(samplePlot, # plot 1
         samplePlot, # plot 2
         samplePlot, # plot 3
         samplePlot, # plot 4
         treemapHere, # plot5
         layout_matrix = rbind(c(1, 2, 3), 
                               c(4, 5, 5)),
         top = textGrob("Sample Title", 
                        gp = gpar(margin = margin(10, 0, 10, 0))),
         heights = c(5, 5))

enter image description here