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

在R的ggplot2中实现环形柱状图按paystatus分组偏移的问题

实现带分组偏移的环形柱状图(ggplot2)

我来帮你搞定这个带分组偏移的环形柱状图问题!首先得明确:你的原始数据里还没有paystatus字段,所以咱们第一步要先构造包含这个分组变量的数据(你可以把示例里的数值替换成你实际的业务数据),然后通过调整x轴位置来实现同一月份下不同paystatus柱子的偏移效果。

步骤1:准备数据

首先,咱们把每个月份对应的三个paystatus类别(early、ontime、late)展开,同时给每个分组分配对应的数值(这里用模拟数据,你可以替换成真实值):

library(ggplot2)
library(dplyr)
library(tidyr)

# 你的原始数据
original_data <- structure(list(month = c("Jan", "Feb", "Mar", "Apr", "Dec"), 
                                n = c(333, 557, 98, 545, 654), 
                                id = 1:5), 
                           class = "data.frame", row.names = c(NA, -5L))

# 扩展数据,添加paystatus分组
data <- original_data %>%
  expand_grid(paystatus = c("early", "ontime", "late")) %>%
  # 给每个paystatus分配模拟数值(替换成你的真实数据)
  mutate(n = case_when(
    paystatus == "early" ~ n * 0.7,
    paystatus == "ontime" ~ n,
    paystatus == "late" ~ n * 0.5
  )) %>%
  # 计算每个分组的偏移量:同一id(月份)下,三个组分别偏移-0.2、0、+0.2
  mutate(id_offset = case_when(
    paystatus == "early" ~ id - 0.2,
    paystatus == "ontime" ~ id,
    paystatus == "late" ~ id + 0.2
  ))

步骤2:绘制带分组偏移的环形柱状图

核心思路是用id_offset作为x轴的位置,这样同一月份的三个柱子就会错开排列,再通过极坐标转换实现环形效果:

ggplot(data, aes(x = id_offset, y = n, fill = paystatus)) +
  # 绘制柱状图,调整宽度让分组之间有间隙
  geom_bar(stat = "identity", width = 0.18) +
  # 转换为极坐标,实现环形效果
  coord_polar(start = 0) +
  # 设置x轴刻度为月份名称,调整位置对应原始id
  scale_x_continuous(breaks = unique(data$id), labels = unique(data$month)) +
  # 添加数值标签,调整位置避免重叠
  geom_text(aes(label = round(n, 0)), 
            position = position_stack(vjust = 0.5),
            color = "white", size = 3) +
  # 自定义样式:去掉背景、调整图例位置等
  theme_minimal() +
  theme(
    panel.grid = element_blank(),
    axis.text.y = element_blank(),
    axis.title = element_blank(),
    legend.title = element_text(hjust = 0.5, size = 10),
    legend.position = "bottom"
  ) +
  labs(fill = "Payment Status")

关键细节说明

  • id_offset的偏移量可以根据你的柱子宽度调整:如果觉得分组间距太大/太小,就修改-0.2/+0.2这个数值,同时对应调整geom_bar的width参数,保证同一月份的三个柱子不重叠。
  • 如果你的真实数据已经包含paystatus字段,直接跳过数据扩展步骤,只需要计算id_offset即可。
  • 数值标签的位置可以通过position_stack的vjust参数调整,确保标签在柱子中间。

这样就能实现你想要的按paystatus分组偏移的环形柱状图啦!

内容的提问来源于stack exchange,提问作者Surbhi Mishra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 06:32:45