如何基于rank列设置数据点边框颜色并按sex分配不同形状?
解决方法
你当前代码里用的geom_bin2d是用来绘制二维分箱热力图的,它会把数据分箱后用色块展示密度,根本不会显示单个数据点的边框和形状——这就是你没得到预期效果的原因。要实现「按rank设数据点边框色、按sex设形状」的需求,得换成散点图层geom_point。
修改后的代码如下:
library(tidyverse) data(Salaries, package="carData") # 给不同rank定义对应的边框颜色(rank是分类变量,用离散色更合适) rank_border_cols <- c( "AsstProf" = "#ff816f", "AssocProf" = "#f1f1f1", "Prof" = "#004252" ) ggplot(Salaries, aes(x = yrs.since.phd, y = salary, color = rank, shape = sex)) + geom_point(fill = NA, size = 3, stroke = 1.5) + # fill=NA让点内部透明,stroke控制边框粗细 theme_bw() + scale_color_manual(values = rank_border_cols) # 绑定rank和自定义边框色
关键修改说明
- 替换
geom_bin2d为geom_point:只有散点图才能展示单个数据点的形状和边框属性 color = rank:直接把数据点的边框颜色绑定到rank列shape = sex:让ggplot自动给不同sex分配不同的点形状fill = NA:让点内部透明,突出边框颜色的效果;如果需要填充色可以自行设置stroke = 1.5:调整边框的粗细,让颜色更明显
如果你坚持想用渐变颜色(虽然rank是分类变量,离散色逻辑更通顺),可以把rank转成数值后用scale_color_gradientn,示例如下:
ggplot(Salaries, aes(x = yrs.since.phd, y = salary, color = as.numeric(rank), shape = sex)) + geom_point(fill = NA, size = 3, stroke = 1.5) + theme_bw() + scale_color_gradientn(colors = c("#ff816f","#f1f1f1","#004252"), labels = levels(Salaries$rank), breaks = 1:3) + labs(color = "rank")
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

