ggplot2多变量映射绘图及自定义颜色形状刻度实现问题
ggplot2 四维度散点图修正实现
原代码核心问题排查
- 映射关系颠倒:需求为Vari映射颜色、Con映射形状,原代码错写为
fill = Con, shape = Vari,完全不符合预期,也是感觉形状映射异常的根本原因。 - 散点颜色映射方式错误:普通实心散点的颜色由
color参数控制,fill仅对21-25号带内填充的特殊点形生效,直接用fill映射会出现颜色无变化、图例缺失的问题。 - 语法疏漏:
aes()括号未闭合,且缺少geom_point()核心几何图层,代码无法正常运行。 - 形状自定义实现:自定义形状的逻辑和自定义颜色完全一致,通过
scale_shape_manual()即可手动指定每个分类对应的点形状编码。
自定义参数配置说明
- 颜色自定义:对应Vari字段的颜色映射,使用
scale_color_manual(),values参数传入与Vari分类一一匹配的色值向量。 - 形状自定义:对应Con字段的形状映射,使用
scale_shape_manual(),values参数传入与Con分类一一匹配的形状编码(常用编码参考:16=实心圆、17=实心上三角、15=实心方块、8=星号、3=十字、4=叉号、18=实心菱形)。
修正后可直接运行的完整代码
library(ggplot2) library(dplyr) # 载入提供的样本数据 data <- structure(list(Vari = c("PM", "TMK", "VPM", "TMK", "TXK", "TNK", "TGK", "VPM", "TMK", "TXK", "TNK", "TGK", "VPM", "TMK", "VPM", "TMK", "TNK", "TGK", "VPM", "TMK", "TXK", "TNK", "TGK", "VPM", "TNK", "TGK", "VPM", "TMK", "TXK", "TNK", "TGK", "TNK", "TGK", "TMK", "TXK", "TNK", "TGK"), Code = c("R10", "J06", "J20-J22", "J20-J22", "J20-J22", "J20-J22", "J20-J22", "J20-J22", "J20-J22", "J20-J22", "J20-J22", "J20-J22", "J06", "J06", "J20", "J20", "J20", "J20", "J20-J22", "J20-J22", "J20-J22", "J20-J22", "J20-J22", "J20", "J20", "J20", "J20-J22", "J20-J22", "J20-J22", "J20-J22", "J20-J22", "H00-H06", "H00-H06", "B85-B89", "B85-B89", "I20-I25", "I20-I25"), Corr = c(-0.569, -0.5125, -0.5739, -0.5843, -0.5603, -0.5744, -0.5547, -0.6168, -0.5897, -0.5458, -0.5867, -0.5628, -0.5047, -0.5086, -0.5172, -0.512, -0.5229, -0.5257, -0.6172, -0.6003, -0.5599, -0.602, -0.5912, -0.5032, -0.5121, -0.5187, -0.5966, -0.59, -0.5661, -0.5879, -0.5589, 0.5104, 0.5758, 0.5491, 0.528, -0.5153, -0.5516), Con = c("Hi", "Eg", "Eg", "Eg", "Eg", "Eg", "Eg", "WFX", "WFX", "WFX", "WFX", "WFX", "WFM", "WFM", "WFM", "WFM", "WFM", "WFM", "WFM", "WFM", "WFM", "WFM", "WFM", "No2", "No2", "No2", "No2", "No2", "No2", "No2", "No2", "PM25", "PM25", "MAM", "MAM", "Hi", "Hi")), row.names = c(23L, 35L, 36L, 37L, 38L, 39L, 40L, 43L, 44L, 45L, 46L, 47L, 50L, 51L, 52L, 53L, 54L, 55L, 58L, 59L, 60L, 61L, 62L, 64L, 65L, 66L, 67L, 68L, 69L, 70L, 71L, 74L, 75L, 86L, 87L, 100L, 101L), class = "data.frame") data %>% # 按相关系数正负拆分分面,同时生成之前简写的Cor字段 mutate(bin = Corr < 0, Cor = Corr) %>% ggplot(aes(x = Code, y = Cor, color = Vari, # Vari变量映射颜色 shape = Con)) + # Con变量映射形状 # 添加散点图层,调整点大小保证可读性 geom_point(size = 3) + # 手动指定Vari分类对应的颜色 scale_color_manual(values = c("PM" = "#E64B35", "TMK" = "#4DBBD5", "VPM" = "#00A087", "TXK" = "#3C5488", "TNK" = "#F39B7F", "TGK" = "#8491B4")) + # 手动指定Con分类对应的点形状 scale_shape_manual(values = c("Hi" = 16, "Eg" = 17, "WFX" = 15, "WFM" = 8, "No2" = 3, "PM25" = 4, "MAM" = 18)) + # 按相关系数正负分面,y轴独立适配范围 facet_grid(bin ~ ., scales = "free_y") + # 主题样式设置 theme_bw() + theme(legend.position = "bottom", axis.text.x = element_text(angle = 90, vjust = 0.6), strip.text.y = element_blank())
补充提示
- 自定义颜色和形状的向量只要保证分类名和值一一对应,不需要和数据中分类的出现顺序完全一致,代码会自动完成匹配。
- 如果需要更好的视觉效果,可将点形切换为21-25号带边框的填充样式,此时将
color映射改为fill映射,搭配scale_fill_manual指定填充色,再通过color参数统一设置点的边框颜色即可。
内容的提问来源于stack exchange,提问作者Mr.Spock
相关产品推荐
相关产品推荐

