You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ggplot2散点图指定点着色异常问题求助

问题描述

我一直被这个绘图问题困扰,找不到出错原因。参考相关解答后,还是有问题。我的数据如下:

comb_frame <- structure(list(decode_beta = c("0.00279501", "-0.0098421", "-0.025254", 
                                             "0.00172701", "0.00531102", "0.000274217", "0.00594772859800487", 
                                             "0.000376995", "0.00082946", "0.00357124647463984", "-0.0018971", 
                                             "0.0083565", "0.00356544", "-0.000609096", "0.00167749", "-0.0150423", 
                                             "-0.022448", "-0.00242648", "-0.00190033", "-0.022692", "0.00536424", 
                                             "-0.00100278", "0.0073661", "0.00092082", "-0.00263694", "0.0076137", 
                                             "0.0072423", "-0.00081708", "-0.01708", "0.00211079", "0.0011098", 
                                             "-0.000107087", "0.0022284", "0.00068709", "-0.00562316159145804", 
                                             "0.00112658", "0.00207365", "-0.000287835", "-0.00286597", "-0.027999", 
                                             "0.00503866", "0.00305786", "-0.001238", "0.0071804", "-0.0084529", 
                                             "0.00556481", "-1.9459e-05", "0.000191271", "-0.017995", "0.002799", 
                                             "-0.024888", "-0.008418", "0.02257", "-0.008174", "-0.019886", 
                                             "-0.00492105", "0.00362115", "0.00392446", "0.00281645"), scallop_beta = c(-0.01011621546, 
                                                                                                                        0.0047657725, -0.02134944, -0.0016247829, 0.0044858415, -0.0015072187, 
                                                                                                                        -0.00782423635, -0.0013813875, -0.001077867, 0.02124057075, 0.0019690364, 
                                                                                                                        -0.004913727, 0.00098559246, 0.00302699872, -0.000395703, -0.02609645934, 
                                                                                                                        -0.02794527222, 0.000946532, 0.000786876, -0.00685633312, -0.004700096, 
                                                                                                                        0.00198448425, 0.00497280424, -0.00480984096, -0.00251334656, 
                                                                                                                        8.4434e-05, 0.00185996837, 0.001175848, -0.01947989552, -0.001227005, 
                                                                                                                        -0.0038851968, -0.00650484, -0.00262378296, 0.003949936, 0.0113079946, 
                                                                                                                        -0.00216854672, -0.000730496, 0.001289556, 0.004527388, -0.01095271456, 
                                                                                                                        0.00580293467, 0.00515290737, 0.000929589, -0.00292289712, 0.0053226888, 
                                                                                                                        -3.969984e-05, -0.0115784, 0.0030260514, -0.00695347872, 0.0092864585, 
                                                                                                                        -0.01863179184, 7.274624e-05, 0.00208976, 0.00042348704, -0.00965808, 
                                                                                                                        -0.0048684602, 0.0045743228, 0.00489489, -0.002105883), significance = c("SCAL SIG", 
                                                                                                                                                                                                 "NON SIG", "NON SIG", "NON SIG", "DEC SIG", "NON SIG", "NON SIG", 
                                                                                                                                                                                                 "NON SIG", "NON SIG", "SCAL SIG", "NON SIG", "DEC SIG", "NON SIG", 
                                                                                                                                                                                                 "NON SIG", "NON SIG", "NON SIG", "NON SIG", "NON SIG", "NON SIG", 
                                                                                                                                                                                                 "NON SIG", "NON SIG", "NON SIG", "DEC SIG", "NON SIG", "NON SIG", 
                                                                                                                                                                                                 "DEC SIG", "NON SIG", "NON SIG", "NON SIG", "NON SIG", "NON SIG", 
                                                                                                                                                                                                 "SCAL SIG", "NON SIG", "NON SIG", "NON SIG", "NON SIG", "NON SIG", 
                                                                                                                                                                                                 "NON SIG", "SCAL SIG", "NON SIG", "DEC SIG", "SCAL SIG", "NON SIG", 
                                                                                                                                                                                                 "DEC SIG", "NON SIG", "DEC SIG", "NON SIG", "NON SIG", "NON SIG", 
                                                                                                                                                                                                 "NON SIG", "NON SIG", "NON SIG", "NON SIG", "NON SIG", "NON SIG", 
                                                                                                                                                                                                 "NON SIG", "SCAL SIG", "SCAL SIG", "NON SIG")), row.names = c(NA, 
                                                                                                                                                                                                                                                               -59L), class = "data.frame")

我需要绘制两组beta值的散点图,按第三列significance分类着色。编写的代码如下:

comb_frame$significance = factor(comb_frame$significance, levels = (unique(comb_frame$significance))) ### 先将significance转为因子

frame_colours = ifelse(comb_frame$significance == "DEC SIG", "#FF0000", ifelse(comb_frame$significance == "SCAL SIG", "#00A08A", "Gray")) ### 创建颜色向量

### 绘制图形
ggplot(comb_frame, aes(x = decode_beta, y = scallop_beta)) +
    theme_classic() +
    labs(x = "DeCODE beta (adjusted)",
         y = "SCALLOP beta (adjusted)",
         title = paste0("Proteomics PheWAS correlations ", curr_path)) +
    geom_abline(intercept = 0) +
    geom_smooth(method = "lm", se = FALSE, colour = "red") +
    geom_point(aes(colour = significance)) + 
    scale_color_manual(breaks = unique(comb_frame$significance), values = frame_colours)

结果只有部分点着色正确,NON SIG对应的灰色完全没显示,转不转因子都一样。

解决方法

问题出在scale_color_manual的参数使用上:你给的values是每个数据点的颜色向量(长度和数据行数一致),但这个参数需要的是对应每个因子水平的颜色值(长度等于因子水平的数量)。

修正后的代码如下:

# 先将significance转为因子,明确水平顺序(可选,但能避免顺序问题)
comb_frame$significance <- factor(comb_frame$significance, levels = c("DEC SIG", "SCAL SIG", "NON SIG"))

# 定义每个因子水平对应的颜色,用命名向量更清晰
colour_map <- c(
  "DEC SIG" = "#FF0000",
  "SCAL SIG" = "#00A08A",
  "NON SIG" = "Gray"
)

# 绘制图形
ggplot(comb_frame, aes(x = decode_beta, y = scallop_beta)) +
  theme_classic() +
  labs(x = "DeCODE beta (adjusted)",
       y = "SCALLOP beta (adjusted)",
       title = paste0("Proteomics PheWAS correlations ", curr_path)) +
  geom_abline(intercept = 0) +
  geom_smooth(method = "lm", se = FALSE, colour = "red") +
  geom_point(aes(colour = significance)) + 
  scale_color_manual(values = colour_map)

关键说明

  • 用命名向量定义颜色映射,每个因子水平对应一个颜色,不需要依赖unique()的返回顺序,避免因数据顺序变化导致颜色匹配错误。
  • scale_color_manual会自动根据因子水平匹配颜色,不需要额外指定breaks(除非你想调整图例顺序)。

内容的提问来源于stack exchange,提问作者Sabor117

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:55:17