You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在treemapifyr中实现子组内分组的一致布局?

解决方案

要让每个中间类别(Intermediate)下的小类别(Small)保持固定方向和顺序排列,你需要强制treemap的布局方式,并确保小类别的顺序固定:

  1. 固定小类别顺序:先对数据按Big、Intermediate、Small排序,确保每个中间类别下始终是Alpha在前,Beta在后。
  2. 强制固定布局方向:在geom_treemap中指定layout参数,强制所有中间类别采用相同的分割方向:
    • layout = "row":水平分割,Alpha始终在左侧,Beta在右侧
    • layout = "column":垂直分割,Alpha始终在顶部,Beta在底部

修改后的完整代码

library(tidyverse)
library(treemapify)

example_data <- 
  data.frame(Number = c(8.989663702,14.93294526,
                          5.727538109,11.47738226,5.962484342,5.528905863,
                          13.89280722,19.05866541,10.17157544,11.59719022,
                          17.93635842,2.034230053,13.38663681,8.729627328,
                          11.16785702,3.345153661,4.826922784,11.24138854),
                  Big = c("First","First","First",
                          "First","First","First","Second","Second",
                          "Second","Second","Third","Third","Third","Third",
                          "Third","Third","Third","Third"),
         Intermediate = c("A","A","B","B","C",
                          "C","D","D","E","E","F","F","G","G","H","H",
                          "I","I"),
                Small = c("Alpha","Beta","Alpha",
                          "Beta","Alpha","Beta","Alpha","Beta","Alpha",
                          "Beta","Alpha","Beta","Alpha","Beta","Alpha",
                          "Beta","Alpha","Beta")
   ) %>%
  # 固定小类别顺序:每个Intermediate下Alpha在前,Beta在后
  arrange(Big, Intermediate, Small)

example_data %>% 
  group_by(Big, Intermediate) %>% 
  mutate(Fraction = Number/sum(Number)) %>% 
  ggplot()+ 
  aes(area = Number,
      subgroup2 = Intermediate,
      subgroup = Big,
      group = Small) + 
  # 强制水平分割,替换为layout = "column"可改为垂直分割
  geom_treemap(aes(fill = Small), layout = "row") +
  geom_treemap_subgroup2_border(colour = "gray50", size = 2) +
  geom_treemap_subgroup_border(colour = "white") +
  geom_treemap_subgroup2_text(place = "centre") +
  geom_treemap_text(aes(label = round(Fraction, 2)))

原理说明

默认的squarify布局会根据子元素的面积比例自动选择水平或垂直分割,目的是让每个区块尽量接近正方形,这就导致了不同中间类别分割方向不一致的问题。通过指定layout = "row"或layout = "column",我们强制所有父节点(Intermediate)的子节点采用统一的排列方向,再配合数据排序固定小类别的顺序,就能实现所有中间类别下的小类别布局完全一致。

内容的提问来源于stack exchange,提问作者markrt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:35:03