R语言中使用Plotly绘制Treemap时百分比显示异常求助
Plotly树形图(Treemap)百分比显示异常问题的原因与解决方案
核心错误总结
你的所有问题都源于两个关键操作失误:
- 手动指定父节点的
values值:Plotly Treemap中,父节点的大小会自动由其子节点的values总和计算得出,无需手动设置父节点的values。若强行设置,Plotly会将所有节点(包括父节点)的values总和作为百分比计算的分母,完全偏离预期逻辑。 - 将
values转为字符型:values参数必须是数值类型,转为字符后Plotly无法正确解析数值进行占比计算。
针对各问题的修正方案
问题1:总占比拆分为两个50%却显示25%
错误原因:你给根节点TOTAL设置了values=100,同时给两个子节点各设50,Plotly计算百分比时的分母是所有节点values的总和(100+50+50=200),因此50/200=25%。
修正代码:仅设置子节点的数值,根节点values设为NA(留空即可):
labels = c("TOTAL", "PARTE 1", "PARTE 2") parents = c("", "TOTAL", "TOTAL") values = c(NA, 50, 50) # 根节点由子节点自动求和,无需手动赋值 plot_ly( type="treemap", labels=labels, parents=parents, values=values, textinfo="label+value+percent parent", domain=list(column=0) )
此时PARTE 1和PARTE 2的占比会正确显示为父节点的50%。
问题2:细分节点后百分比显示错误
错误原因:除了手动设置父节点values的问题,你还将values转为了字符型,导致Plotly无法正确计算数值占比。
修正代码:移除字符型转换,仅保留最底层子节点的数值,所有父节点设为NA:
labels = c("TOTAL", "PARTE 1", "PARTE 2", "PARTE 1-A", "PARTE 1-B", "PARTE 2-A") parents = c("", "TOTAL", "TOTAL", "PARTE 1", "PARTE 1", "PARTE 2") values = c(NA, NA, NA, 25, 25, 50) # 仅设置叶子节点的数值 plot_ly( type="treemap", labels=labels, parents=parents, values=values, textinfo="label+value+percent parent", domain=list(column=0) )
此时:
PARTE 1-A占PARTE 1的比例为25/(25+25)=50%PARTE 2-A占PARTE 2的比例为50/50=100%
完全符合预期。
问题3:多种百分比显示数值不符
错误原因:同样是父节点values设置错误+字符型转换的问题,修正后即可正常显示各类百分比。
修正代码:
labels = c("TOTAL", "PARTE 1", "PARTE 2", "PARTE 1-A", "PARTE 1-B", "PARTE 2-A") parents = c("", "TOTAL", "TOTAL", "PARTE 1", "PARTE 1", "PARTE 2") values = c(NA, NA, NA, 25, 25, 50) plot_ly( type="treemap", labels=labels, parents=parents, values=values, textinfo="label+value+percent parent+percent entry+percent root", domain=list(column=0) )
此时:
PARTE 1-A占根节点TOTAL的比例为25/(25+25+50)=25%PARTE 1-A占父节点PARTE 1的比例为50%
所有百分比显示均符合预期。
关键规则总结
- 仅设置最底层叶子节点的
values:父节点(包括根节点)的大小由子节点自动求和,无需手动指定,否则会破坏百分比计算逻辑。 values必须为数值类型:不能转为字符型,否则Plotly无法解析数值进行计算。
内容的提问来源于stack exchange,提问作者Edgar Alarcón
相关产品推荐
相关产品推荐

