You need to enable JavaScript to run this app. ggplot2多变量映射绘图及自定义颜色形状刻度实现问题
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 05:54:03