使用waffle包绘制的图表缺失一组,如何显示全部七组?
解决waffle图最后一组不显示的问题
你的问题其实涉及两个层面:一是极小占比的组在图例中被自动省略,二是该组的数值太小导致图中没有对应的方块。下面给你详细的解决思路和优化代码:
问题根源
最后一组「Storage systems」的数值仅为0.07,占比不到0.05%:
waffle()默认会将这类极小的非整数数值取整为0,导致图中没有对应的方块;- 图例渲染逻辑会自动省略占比极低的类别,导致组名无法显示。
解决方案
1. 强制保留所有图例标签
你发现的添加labels参数的方法非常有效,它能强制让图例显示全部7个组的名称,不受占比影响:
counts<-c(135.92, 15.98, 14.97, 14.15, 5.82, 11.82, 0.07 ) counts_names<-sprintf("%s (%s)", c("Coal", "Gas", "Wind", "Hydro", "Grid-scalar solar", "Rooftop solar", "Storage systems"), scales::percent(round(counts/sum(counts), 4))) names(counts)<-counts_names # 调整后的代码:通过labels参数强制指定所有图例标签 Generation_graph<-waffle(counts)+ scale_fill_tableau(name=NULL, labels=counts_names)
2. 让极小占比的组在图中显示方块
因为原始数值太小,waffle()会自动取整为0,导致图中看不到该组的方块。你可以通过缩放数值+设置总方块数的方式,确保小占比组至少能显示1个方块:
# 按占比缩放数值,设置总方块数为2000(可根据需求调整) counts_scaled <- round(counts / sum(counts) * 2000) # 兜底:确保最后一组至少有1个方块 counts_scaled[7] <- max(counts_scaled[7], 1) names(counts_scaled) <- counts_names # 生成完整显示所有组的waffle图 Generation_graph<-waffle(counts_scaled, total=2000)+ scale_fill_tableau(name=NULL, labels=counts_names)
补充说明
waffle()的values参数默认会把输入数值直接当作方块数,所以非整数会被自动取整,这也是极小数值消失的核心原因;- 总方块数设置得越大,小占比组越容易显示,但也要注意避免图表过于庞大影响可读性。
内容的提问来源于stack exchange,提问作者Eve Chanatasig
相关产品推荐
相关产品推荐

