ggplot2中仅对单个分组散点执行大小映射的实现方法
ggplot2 分组控制点大小映射实现方法
要实现Random 30组散点随作答尝试次数缩放、Mandatory 10组散点固定大小的效果,核心思路是拆分两个geom_point图层分别绘制两组数据,不要在全局美学映射里统一绑定size属性,避免两组都被套用大小映射规则。
核心修改点
- 删除原有全局
geom_point()中的size映射配置 - 新增两个独立的散点图层:
- 第一个图层仅加载
section = "random"的子集,配置aes(size = questionAttempt)实现动态大小映射 - 第二个图层仅加载
section = "mandatory"的子集,直接在aes外设置固定size参数,不关联作答次数字段
- 第一个图层仅加载
- 调整size标度配置,保证图例仅展示Random组的尝试次数对应大小规则,不会出现Mandatory组的冗余图例项
修改后完整代码
ggplot(weekData, aes(x=firstPB, y=firstAverageQScore))+ # 绘制Random 30组散点:点大小映射到题目作答尝试次数 geom_point(data = ~.x[.x$section == "random",], aes(colour=section, size=questionAttempt))+ # 绘制Mandatory 10组散点:使用统一固定大小,size数值可按需调整 geom_point(data = ~.x[.x$section == "mandatory",], aes(colour=section), size = 3)+ labs(size="Number of attempts")+ geom_smooth(method = glm, se= F) + ggtitle(paste0("Week ",week," First Attempts")) + xlab("Point Biserial") + xlim(-1,1)+ ylab("Average Score for Question(%)") + ylim(0,100) + geom_label_repel(aes(label=number), alpha=0.5,max.overlaps = Inf)+ geom_vline(xintercept = 0, linetype="dashed", color = "black", size=0.5)+ scale_colour_discrete(name="Group", breaks=c("random", "mandatory"), labels=c("Random 30","Mandatory 10")) + # 可选:调整Random组点的大小缩放范围,c(最小值, 最大值)按需修改 # scale_size_continuous(range = c(1,6)) + theme(panel.background = element_rect(fill = "white", colour = "white", size = 0.5, linetype = "solid")) + annotate("rect", xmin=(0.25), xmax=(Inf), ymin=(30), ymax=(70), fill="#b1b3b133")
注1:代码中Mandatory组的固定size默认设为3,你可以根据出图的实际视觉效果调整数值大小;如果觉得Random组的点大小缩放范围不符合预期,可以取消注释
scale_size_continuous那行代码,修改range参数的两个值即可自定义尺寸区间。
注2:如果你使用的ggplot2版本低于3.3.0,不支持~.x的简易子集写法,可以把两个geom_point层的data参数替换为data = subset(weekData, section == "random")和data = subset(weekData, section == "mandatory"),运行效果完全一致。
内容的提问来源于stack exchange,提问作者jrb
相关产品推荐
相关产品推荐

