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

在R中实现基于非数值轴的加权饼图散点式排列

解决方案

要实现你需要的加权饼图布局,我们可以通过scatterpie包结合ggplot2解决非数值x轴的问题,同时满足饼图排序、尺寸调整的需求。以下是完整实现步骤和代码:

步骤说明

  1. 数据预处理:将Season转换为有序因子,确保季节显示顺序符合预期。
  2. 饼图位置映射:将Season和Rank分别映射到坐标轴,让每个Basket的饼图对应到(Season, Rank)的位置。
  3. 调整饼图尺寸:通过scale_radius设置饼图大小范围,确保小频率的饼图也能清晰显示。
  4. 坐标轴方向调整:反转坐标轴让Rank从上到下显示,匹配你的需求。

完整代码

# 加载所需包
library(ggplot2)
library(scatterpie)
library(dplyr)

# 预处理数据:设置Season的显示顺序
fruit <- fruit %>%
  mutate(Season = factor(Season, levels = c("Summer", "Autumn", "Winter")))

# 绘制加权饼图
ggplot() +
  # 添加每个Basket的散点饼图,指定水果列作为饼图组成部分
  geom_scatterpie(
    data = fruit,
    aes(x = Season, y = Rank, group = Basket),
    cols = c("Apples", "Oranges", "Plums", "Grapes"),
    size = fruit$Frequency,
    color = NA  # 可选:去掉饼图边框,优化视觉效果
  ) +
  # 调整饼图尺寸范围,最小尺寸设为3,确保小饼图可见
  scale_radius(range = c(3, 12)) +
  # 设置坐标轴标签
  labs(x = "Season", y = "Rank") +
  # 反转y轴,让Rank从上到下显示(1在最上方,5在最下方)
  scale_y_reverse(breaks = 1:5) +
  # 翻转坐标轴,实现Season为垂直轴、Rank为从上到下的水平轴布局
  coord_flip() +
  # 调整主题样式
  theme_minimal() +
  theme(
    axis.text = element_text(size = 12),
    axis.title = element_text(size = 14, face = "bold"),
    legend.title = element_text(size = 12, face = "bold"),
    legend.text = element_text(size = 10)
  ) +
  # 设置图例名称
  scale_fill_discrete(name = "Fruit")

代码解释

  • geom_scatterpie:核心函数,将每个Basket的水果数量转换为饼图,cols参数指定构成饼图的列。
  • scale_radius(range = c(3, 12)):限制饼图的最小和最大尺寸,避免小频率的饼图(如Frequency=4的Basket O)过小无法看清。
  • scale_y_reverse:反转y轴,让Rank从上到下依次显示1到5。
  • coord_flip():交换x轴和y轴位置,最终实现Season作为垂直轴、Rank作为从上到下排列的水平轴布局。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:05:31