如何在R的ggplot2中为原始数据散点图添加SCS-MP2参考线?
问题排查与修正方案
原代码核心问题
- ggplot语法错误:在
aes()中使用cg$列名是冗余且易出错的写法,ggplot会自动从指定的data中读取列 geom_line()参数错误:原写法未正确指定参考线的数据源和映射关系,导致生成混乱线条- 图例标题错误:将
color的图例标题设为"Class Type",但实际映射的是Functional变量 - 包加载逻辑错误:
install.packages()放在library()之后,且未加安装判断,重复执行会报错
修正后的代码
# Load Packages # 先判断包是否安装,未安装再执行安装 if (!require("car")) install.packages("car") if (!require("ggplot2")) install.packages("ggplot2") if (!require("readxl")) install.packages("readxl") if (!require("tidyr")) install.packages("tidyr") library(ggplot2) library(readxl) library(car) library(tidyr) # 读取数据(若使用本地文件则启用下方代码,否则直接使用提供的dput数据) # cg <- read_excel("ReultsAllTogether_stacks.xlsx") cg <- structure(list(Functional = c("B3LYP", "SCS-MP2", "B3LYP", "SCS-MP2", "B3LYP", "SCS-MP2", "B3LYP", "SCS-MP2", "B3LYP", "SCS-MP2", "B3LYP", "SCS-MP2", "B3LYP", "SCS-MP2", "B3LYP", "SCS-MP2", "B3LYP", "SCS-MP2", "B3LYP", "SCS-MP2", "B3LYP", "SCS-MP2", "B3LYP", "SCS-MP2", "B3LYP", "SCS-MP2", "B3LYP", "SCS-MP2", "B3LYP", "SCS-MP2", "B3LYP", "SCS-MP2", "B3LYP", "SCS-MP2", "B3LYP", "SCS-MP2", "B3LYP", "SCS-MP2", "B3LYP", "SCS-MP2"), Basis = c("b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1", "b1" ), Class = c("C2", "C2", "C2", "C2", "C2", "C2", "C2", "C2", "C2", "C2", "C3", "C3", "C3", "C3", "C3", "C3", "C3", "C3", "C3", "C3", "C4", "C4", "C4", "C4", "C4", "C4", "C4", "C4", "C4", "C4", "C5", "C5", "C5", "C5", "C5", "C5", "C5", "C5", "C5", "C5"), In = c("Li", "Li", "Na", "Na", "K", "K", "Rb", "Rb", "Cs", "Cs", "Li", "Li", "Na", "Na", "K", "K", "Rb", "Rb", "Cs", "Cs", "Li", "Li", "Na", "Na", "K", "K", "Rb", "Rb", "Cs", "Cs", "Li", "Li", "Na", "Na", "K", "K", "Rb", "Rb", "Cs", "Cs"), CT = c(0.40456288154279, 0.372834665210701, 0.355454014133149, 0.313462952666224, 0.304072955130357, 0.251637090727318, 0.28181198329498, 0.222999362898535, 0.254776916782981, 0.194195055958677, 0.404186306229368, 0.37268736669808, 0.354997616399174, 0.31330968123421, 0.30365432465555, 0.251510008485998, 0.281443473835977, 0.222902895704843, 0.254511080266118, 0.194137507673419, 0.401871772097766, 0.370918519253672, 0.351142910239732, 0.310714862030015, 0.298069757042778, 0.247839120659505, 0.274977651015282, 0.218806234600371, 0.274977651015282, 0.218806234600371, 0.407912189945616, 0.376388091732588, 0.360278099029074, 0.31813744101535, 0.309981024667932, 0.257480792559644, 0.288133014562052, 0.229128691213999, 0.461803504626895, 0.337946512062839), BE = c(-18.8252999999829, -21.1847940758919, -0.627509999985161, -0.788704768746296, 2.51003999994065, -1.06039777353009, 3.12642801277324, -1.1722263305953, NA, NA, -25.1003999999772, -28.4270313132134, -20.0803199999532, -23.0303260862894, -16.3152600000422, -21.3725136924209, -14.4327300000154, -19.2799058945922, -11.9226900000034, -18.1946901005642, -27.6104399999892, -31.334467121123, -28.8654600000308, -32.3045724807506, -15.0602400000719, -21.3828236816955, -11.9226900000748, -17.9596938806561, -5.64759000008047, -16.4690752511992, -20.0803200000245, -23.5808468844384, -23.8453800000068, -34.772600686251, -25.727910000105, -33.2706429510877, -23.217870000093, -29.9168843805051, -20.707830000081, -29.0829361406804)), row.names = c(NA, -40L), class = c("tbl_df", "tbl", "data.frame")) # 处理BE列数据类型 cg$BE <- as.double(cg$BE) # 筛选SCS-MP2子集 scs_mp2 <- subset(cg, Functional == 'SCS-MP2') # 统一In的因子顺序,保证x轴显示一致 in_order <- c("Li", "Na", "K", "Rb", "Cs") cg$In <- factor(cg$In, levels = in_order) scs_mp2$In <- factor(scs_mp2$In, levels = in_order) # 绘制图表 be_cg <- ggplot(cg, aes(x = In, y = BE, group = Class)) + # 绘制所有散点,按Functional区分颜色 geom_point(aes(color = Functional)) + # 绘制SCS-MP2参考线,使用筛选后的数据集,指定粉色 geom_line(data = scs_mp2, aes(x = In, y = BE), color = "pink", linewidth = 1) + # 按Basis和Class分面展示 facet_grid(Basis ~ Class) + # 设置图表标签 labs(x = "In", y = "BE", color = "Functional") + # 可选:统一SCS-MP2的点和线颜色,提升可读性 scale_color_manual(values = c("B3LYP" = "black", "SCS-MP2" = "pink")) print(be_cg)
关键修正点说明
- 数据源与映射规范:ggplot中统一使用列名而非
data$列名的写法,避免分组和映射冲突 - 参考线绘制:直接使用筛选后的
scs_mp2数据集绘制线条,确保每个分面中只显示对应分组的SCS-MP2数据 - 因子顺序统一:提前将
In列转为指定顺序的因子,保证x轴元素排列一致 - 颜色一致性:通过
scale_color_manual让SCS-MP2的散点和参考线颜色统一,便于对比观察 - 包加载优化:添加包安装判断,避免重复安装导致的报错
内容的提问来源于stack exchange,提问作者Moe El
相关产品推荐
相关产品推荐

