如何在R语言中创建区分贫困状态的环形散点图
基于ggplot2实现环形散点图的解决方案
原始数据
Tenure Type In Poverty Not in Poverty Tenure_A 45786 784733 Tenure_B 98453 359584 Tenure_C 34954 385884 Tenure_D 29586 948434 Tenure_E 74854 385869
需求说明
创建环形散点图:
- 内圈用散点代表对应Tenure类型的贫困人口(如Tenure_A需显示45786个点)
- 外圈用散点代表对应Tenure类型的非贫困人口
问题分析
你当前的代码存在两个核心问题:
- 数据是宽格式,无法直接映射贫困状态的分类变量
- 极坐标的映射逻辑错误,没有区分内圈/外圈的半径,也没有将Tenure类型映射为极坐标的角度
解决方案
步骤1:数据预处理
需要把宽格式数据转成长格式,并根据人口数量生成对应行数的观测(每个观测代表一个人),同时为内圈/外圈设置不同的半径值:
library(tidyverse) # 构建原始数据框 Poverty <- tibble( Tenure_Type = c("Tenure_A", "Tenure_B", "Tenure_C", "Tenure_D", "Tenure_E"), In_Poverty = c(45786, 98453, 34954, 29586, 74854), Not_in_Poverty = c(784733, 359584, 385884, 948434, 385869) ) # 转长格式并生成对应数量的点 Poverty_long <- Poverty %>% pivot_longer( cols = -Tenure_Type, names_to = "Poverty_Status", values_to = "Count" ) %>% uncount(Count) %>% # 按人口数重复行,每个行对应一个散点 mutate( # 内圈(贫困人口)半径设为1,外圈(非贫困人口)设为2 Radius = ifelse(Poverty_Status == "In_Poverty", 1, 2) )
步骤2:绘制环形散点图
使用极坐标将Tenure类型映射为角度,半径区分内外圈,用抖动点避免完全重叠:
ggplot(Poverty_long, aes(x = Radius, y = Tenure_Type, color = Poverty_Status)) + # 用geom_jitter让点轻微分散,alpha处理高密度点的透明度 geom_jitter(size = 0.5, alpha = 0.3, width = 0.1) + # 将y轴(Tenure_Type)转为极坐标的角度 coord_polar(theta = "y") + # 调整半径范围,避免点超出画布 scale_x_continuous(limits = c(0, 2.5)) + # 自定义标签和主题 labs( title = "不同居住类型的贫困状态环形散点图", color = "贫困状态" ) + theme_minimal() + theme( # 隐藏不必要的网格和轴标签 panel.grid = element_blank(), axis.text.x = element_blank(), axis.title = element_blank() )
关键说明
uncount(Count):这是实现“一个点代表一个人”的核心,它会根据每个类别的人口数生成对应行数的观测。coord_polar(theta = "y"):将分类变量Tenure_Type映射为极坐标的角度,让每个居住类型占据一个独立的扇形区域。geom_jitter的参数:width控制点在半径方向的分散程度,alpha降低透明度,避免高密度区域的点完全重叠成块。
内容的提问来源于stack exchange,提问作者user21070007
相关产品推荐
相关产品推荐

