如何在ggplot2散点图中绘制6个维度 修复shape美学映射不生效问题
ggplot2散点图shape映射不生效问题解答
关于散点图维度上限的问题
ggplot2本身没有设置散点图可映射维度的硬性上限,只要是geom_point支持的美学参数(x、y、color、fill、size、shape、alpha等)都可以独立映射变量,你遇到的问题和维度限制无关,是代码写法错误导致的。
shape映射不生效的原因
核心原因是你在geom_point()层硬编码了pch=21参数:pch是shape参数的别名,在几何对象层直接硬编码的参数优先级高于全局aes()里的映射规则,所以所有点的形状都被固定为21号(带边框的可填充圆形),自然不会随minsplit.cat的取值变化。
修复方案
分两种场景处理:
- 场景1:需要保留fill填充映射的效果
21-25号形状是支持边框色+填充色双属性的,如果你要保留现有fill = maxdepth的映射效果,需要:- 删除
geom_point()里的pch=21参数 - 新增
scale_shape_manual()手动指定映射使用的形状为21-25号的可填充形状,示例代码如下:
- 删除
ggplot(df, aes(x=cp, y=tpr.test.mean, color=minbucket, size=maxcompete, fill = maxdepth, shape = minsplit.cat)) + geom_point() + scale_color_gradient(low="red", high="green") + scale_fill_gradient(low = "white", high = "purple")+ scale_size_continuous(range=c(1,3.4)) + # 手动指定用可填充形状,数量和minsplit.cat的分类数一致即可 scale_shape_manual(values = c(21,22,23,24,25)[1:length(unique(df$minsplit.cat))]) + facet_grid(maxcompete.cat ~ maxdepth.cat)+ theme(legend.key.size = unit(0.25, "cm"))+ theme(axis.text.x = element_text(angle = 90))
- 场景2:不需要fill填充映射
如果不需要保留填充效果,直接删除geom_point()里的pch=21即可,shape会自动映射默认的实心形状,原有fill映射可以删除避免冗余。
额外注意:ggplot2默认提供的离散形状调色板只有6种形状,如果你的minsplit.cat分类数超过6,会触发报错,此时需要手动通过scale_shape_manual()补充更多自定义形状即可。

内容的提问来源于stack exchange,提问作者S J
相关产品推荐
相关产品推荐

