R语言如何借助ifelse为散点图按数据集分类列取值分色
基础R散点图按regime三分类上色的实现方法
方法1:嵌套ifelse实现(适配你之前了解的ifelse逻辑)
ifelse单次仅支持单条件分支判断,针对3个类别的regime字段,嵌套两层ifelse逻辑即可生成与散点一一对应的颜色向量,直接传入plot的col参数即可自动逐点上色:
- 先生成逐点匹配的颜色值:
# 自定义三类政权对应的颜色,可根据需求调整色值 point_colors <- ifelse(demo$regime == "free", "#2E8B57", ifelse(demo$regime == "not free", "#CD5C5C", "#FFA500"))
- 调整原有plot代码,新增
col参数传入颜色向量:
plot(demo$GDP, demo$FHouse, xlab = "Country's GDP", ylab = "Freedom House Rating", pch=16, xlim = c(500,5000), family="serif", col = point_colors)
注:基础R的col参数原生支持传入与样本量等长的颜色向量,会严格按数据行顺序为每个散点匹配对应颜色,无需手动循环遍历。
方法2:映射表匹配实现(后续扩展更方便)
分类数量较多时,嵌套ifelse的可读性会快速下降,可使用命名色板向量直接匹配,无论多少个分类都不需要写多层嵌套,调整颜色映射仅需修改对应色表即可:
- 提前定义分类与颜色的对应关系:
# 自定义政权类型-颜色映射表 regime_color_map <- c( "free" = "#2E8B57", "not free" = "#CD5C5C", "partly free" = "#FFA500" ) # 按数据里的regime取值直接匹配对应颜色 point_colors <- regime_color_map[demo$regime]
后续plot代码和方法1完全一致,传入col = point_colors即可。
实用补充
- 原代码中设置的
xlim = c(500,5000)会裁切掉GDP超过5000的样本点(示例数据中的阿根廷、澳大利亚都会被排除在绘图区外),如果需要展示全部样本,可以将xlim调整为适配实际GDP范围,比如xlim = c(500, 30000)。- 上色完成后可以搭配简易图例明确颜色对应关系,在plot代码后追加一行即可:
legend("topright", legend = names(regime_color_map), col = regime_color_map, pch = 16)
内容的提问来源于stack exchange,提问作者Rnub
相关产品推荐
相关产品推荐

