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

使用ggplot2绘制并列饼图时图表不完整的问题求助

解决分年份并列饼图显示不完整的问题

我看了你的代码和数据,知道你想做分年份的区域占比并列饼图,但现在图表显示不完整,问题主要出在数据融化的方式和饼图的比例计算上,咱们来一步步修正:

问题分析

  1. 你用melt()的时候没指定id.vars,导致Year列也被当成变量融化了,这会让每个年份的分组逻辑混乱,饼图的比例计算自然出错。
  2. 直接用原始值绘图,每个年份的数值总和不一样,结合coord_polar()和facet_wrap()后,就会出现饼图被压缩、显示不全的情况。

修正步骤&完整代码

首先推荐用reshape2包(比旧的reshape包更稳定)和dplyr来处理数据,先加载需要的包:

library(reshape2)
library(ggplot2)
library(dplyr)

然后正确融化数据并计算各区域的占比:

# 融化数据,指定Year为分组ID,只处理区域列
test1 <- melt(comp, id.vars = "Year", variable.name = "Region", value.name = "Value")

# 按年份分组,计算每个区域占当年总和的比例
test1 <- test1 %>%
  group_by(Year) %>%
  mutate(Proportion = Value / sum(Value)) %>%
  ungroup()

最后绘制完整的并列饼图:

ggplot(test1, aes(x = factor(1), y = Proportion, fill = Region)) +
  geom_bar(stat = "identity", width = 1) +
  # 优化主题:去掉多余轴元素,把图例放在右侧
  theme(legend.position = "right",
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        panel.background = element_blank()) +
  scale_x_discrete(NULL, expand = c(0, 0)) +
  scale_y_continuous(NULL, expand = c(0, 0)) +
  coord_polar(theta = "y") +
  # 设置分面为一行,方便横向对比各年份
  facet_wrap(~Year, nrow = 1)

为什么这样改?

  • 指定id.vars = "Year"保证每个区域的数据都对应正确的年份,不会混淆分组。
  • 计算Proportion让每个年份的饼图总和都是1,这样所有饼图都会显示为完整的圆形,不会因为数值总和差异导致显示不全。
  • 调整分面为一行,加上清晰的图例,能更直观地对比各年份的区域占比变化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:00:16