在R中实现基于非数值轴的加权饼图散点式排列
解决方案
要实现你需要的加权饼图布局,我们可以通过scatterpie包结合ggplot2解决非数值x轴的问题,同时满足饼图排序、尺寸调整的需求。以下是完整实现步骤和代码:
步骤说明
- 数据预处理:将
Season转换为有序因子,确保季节显示顺序符合预期。 - 饼图位置映射:将
Season和Rank分别映射到坐标轴,让每个Basket的饼图对应到(Season, Rank)的位置。 - 调整饼图尺寸:通过
scale_radius设置饼图大小范围,确保小频率的饼图也能清晰显示。 - 坐标轴方向调整:反转坐标轴让
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
相关产品推荐
相关产品推荐

