R语言如何绘制矩形树状图

前言

此篇是R语言undefined包绘制矩形树状图的教程。

什么是矩形树状图

矩形树形图是一种用于展示层次关系数据的可视化方式。

它将数据以矩形的形式呈现,并通过树形结构将不同数据项之间的关联展现出来。

这种图表可以帮助人们更直观地理解数据之间的联系和组织结构,适用于各种领域的数据分析和展示。

绘图前的数据准备

​demo数据可以在https://www.r2omics.cn/res/demodata/treemap2.txt下载。

在此示例数据汇总,parent和id列用于构建树状结构(以有多个列名,用于构建树状结构),value用来映射矩形大小和颜色。

# A tibble: 57 x 3
   id     value parent
   <chr>  <int> <chr> 
 1 Name1     62 group1
 2 Name2  25941 group1
 3 Name3  23524 group1
 4 Name4  12512 group1
 5 Name5     90 group1
 6 Name6   7642 group1
 7 Name7   1646 group1
 8 Name8   1973 group1
 9 Name9   4665 group1
10 Name10  1561 group1
# i 47 more rows

R语言如何绘制矩形树状图

# 代码来源:https://www.r2omics.cn/
# 加载包
library(tidyverse)
library(treemapify) #从github上安装,devtools::install_github("wilkox/treemapify")

# 读取数据
df = read.delim("https://www.r2omics.cn/res/demodata/treemap2.txt")

# 由treemapify函数计算矩形的位置
treeMapData <- treemapify(df,
                         area = "value",      # 面积映射
                         subgroup = "parent", # 第1层映射
                         subgroup2="id",      # 第2层映射
                         # subgroup3="",      # 第3层映射
                         layout = "squarified", # 布局
                         start = "bottomleft", # 控制起始位置。bottomleft topleft topright bottomright
                         xlim = c(0, 1),       # 控制x轴的范围,通过xlim和ylim可以设置最后矩形的长宽比例
                         ylim = c(0, 1)
                         )


# 计算每个小矩形的面积,如果面积小于0.01则不标记
treeMapPlot = treeMapData %>%
  mutate(Area = (xmax-xmin)*(ymax-ymin)) %>%
  mutate(label = ifelse(Area<0.01,"",id))

# 为了标记最外层,需要计算标记的位置。
# 从 treeMapData 数据集中提取出每个父节点的最小和最大坐标信息,并将其合并到一个新的数据集 parentLabel中。
parentLabelMin = treeMapData %>%
  group_by(parent) %>%
  slice_min(xmin) %>%
  slice_min(ymin,with_ties = F) %>%
  ungroup() %>%
  select(parent,xmin,ymin)
parentLabelMax = treeMapData %>%
  group_by(parent) %>%
  slice_max(xmax) %>%
  slice_max(ymax,with_ties = F) %>%
  ungroup() %>%
  select(parent,xmax,ymax)
parentLabel = full_join(parentLabelMin,parentLabelMax)

# 绘图
ggplot(treeMapPlot)+
  geom_rect(aes(xmin=xmin,xmax=xmax,ymin=ymin,ymax=ymax,fill=parent),colour="black")+ # 根据坐标,绘制矩形
  geom_label(aes(x=(xmin+xmax)/2,y=(ymin+ymax)/2,label=parent),data=parentLabel,size=5,fill="white",alpha=0.5)+ # 标记第1层文本
  geom_text(aes(x=(xmin+xmax)/2,y=(ymin+ymax)/2,label=label,size=Area))+ # 标记第2层文本
  scale_size(range=c(0,5))+ # 调整标记的大小
  theme_void()+
  scale_fill_brewer(palette = "Set1")+ # 填充调色板
  coord_fixed()+  # 使x轴和y轴比例尺相同
  theme(legend.position = "none") # 不显示图例