R ggplot极坐标下geom_rect绘制环形图的相关优化问题咨询
优化后完整代码(同步解决所有提问)
library(tidyverse) library(scales) # 用于金额格式化,提升可读性 test_data <- data.frame( category = c("retail","retail","retail","retail","retail","hotel"), sub_category = c("retail_sub1","retail_sub2","retail_sub3","retail_sub4","retail_sub5","hotel"), amount = c(51083.26,27454.13,22495.89,21195.05,16863.69,60210.6) ) # 代码简化:用分组批量计算替代硬编码赋值 test_data1 <- test_data %>% mutate( ymax = cumsum(amount), ymin = lag(cumsum(amount), default = 0), sub_mid = (ymin + ymax)/2 # 提前计算子分类标签中点,避免重复计算 ) %>% group_by(category) %>% mutate( # 自动计算每个父分类的标签中点,无需单独给每个分类写判断逻辑 cat_mid = (min(ymin) + max(ymax))/2 ) %>% ungroup() # 提前过滤子分类数据,避免重复写两次filter sub_data <- filter(test_data1, sub_category != "hotel") test_data1 %>% ggplot() + # 父分类矩形,fill映射到一级分类 geom_rect(aes(xmin = 3, xmax = 6, ymin = ymin, ymax = ymax, fill = category)) + # 父分类标签:拼接分类名+对应总金额,解决标签加数值需求 geom_text(aes(x = 4.5, y = cat_mid, label = paste0(category, "\n", comma(sum(amount)))) , stat = "unique") + # 子分类矩形:fill和父分类共用映射,仅调整alpha区分,解决配色需求 geom_rect(data = sub_data, aes(xmin = 6, xmax = 8, ymin = ymin, ymax = ymax, fill = category), alpha = 0.5) + # 子分类标签:拼接子分类名+对应金额 geom_text(data = sub_data, aes(x = 7, y = sub_mid, label = paste0(sub_category, "\n", comma(amount)))) + coord_polar(theta = "y") + theme_minimal() + # 隐藏无用图例 guides(alpha = "none") # 锯齿优化方案: # 1. 本地预览:将RStudio图形后端切换为AGG(路径:工具-全局选项-图形-后端选择AGG) # 2. 导出使用:保存为svg/pdf矢量格式天然无锯齿;若存png格式设置dpi≥300即可,示例: # ggsave("环形图.png", dpi = 300, width = 8, height = 8, device = ragg::agg_png)
需求对应说明
- 代码简化:去掉了硬编码的分类位置判断逻辑,改用分组自动计算所有父分类标签位置,重复使用的子分类数据提前提取,减少冗余代码。
- 标签加amount数值:用
paste0拼接分类名称和对应金额,配合scales::comma给金额添加千分位分隔符,可读性更强。 - 子分类配色调整:子分类不再将fill映射到二级分类,和父分类共用category的颜色映射,仅调整alpha透明度即可实现同色系区分效果。
- 边界锯齿优化:改用ragg渲染后端、导出时设置高dpi或使用矢量格式,即可完全解决锯齿问题。
内容的提问来源于stack exchange,提问作者anderwyang
相关产品推荐
相关产品推荐

