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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:45:04