使用GGally绘制parcoordplot,如何按标签占比设置线条颜色而非最后行?
这问题我之前也碰到过,GGally的ggparcoord确实会按数据行的顺序覆盖颜色,最后出现的标签会生效。要实现按占比最高的标签来着色,核心思路是先预处理数据,给每组完全相同的特征行分配占比最高的标签,然后再用处理后的数据绘图。
具体步骤如下:
1. 构造示例数据(和你的案例一致)
dataset <- data.frame(V1 = c(1,1,1), V2 = c(1,1,1), V3 = c(1,1,0))
2. 预处理数据:给每组特征分配占比最高的标签
这里用dplyr来做分组统计,逻辑很清晰:
- 按所有特征列(这里是V1、V2)分组
- 统计每个标签的出现次数
- 为每组选出出现次数最多的标签(如果有平局,可以自定义规则)
代码如下:
library(dplyr) processed_data <- dataset %>% # 按特征列分组,确保相同特征的行被归为一组 group_by(V1, V2) %>% # 统计每个标签的出现频数 count(V3, name = "freq") %>% # 选出频数最高的标签;with_ties=FALSE表示如果有多个标签频数相同,只取第一个(可根据需求调整) slice_max(freq, n = 1, with_ties = FALSE) %>% ungroup() %>% # 去掉频数列,只保留特征和最终标签 select(-freq) %>% # 和去重后的特征行做连接,确保每个唯一特征组都有对应的标签 right_join(dataset %>% distinct(V1, V2), by = c("V1", "V2"))
如果遇到标签频数相同的情况(比如两组各出现1次),可以调整规则,比如优先选择数值更大的标签:
processed_data <- dataset %>% group_by(V1, V2) %>% count(V3, name = "freq") %>% # 先按频数降序,再按标签值降序,确保频数相同时选更大的标签 arrange(desc(freq), desc(V3)) %>% # 取每组的第一行 slice(1) %>% ungroup() %>% select(-freq) %>% right_join(dataset %>% distinct(V1, V2), by = c("V1", "V2"))
3. 用处理后的数据绘制平行坐标图
现在直接用processed_data绘图,就能得到按占比最高标签着色的结果了:
library(GGally) ggparcoord(processed_data, columns = 1:2, groupColumn = 'V3', scale = 'globalminmax')
这样不管原始数据行的顺序如何,相同特征的行都会统一使用占比最高的标签颜色啦。
内容的提问来源于stack exchange,提问作者costa_10
相关产品推荐
相关产品推荐

