如何在treemapifyr中实现子组内分组的一致布局?
解决方案
要让每个中间类别(Intermediate)下的小类别(Small)保持固定方向和顺序排列,你需要强制treemap的布局方式,并确保小类别的顺序固定:
- 固定小类别顺序:先对数据按
Big、Intermediate、Small排序,确保每个中间类别下始终是Alpha在前,Beta在后。 - 强制固定布局方向:在
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
相关产品推荐
相关产品推荐

