R语言ggplot绘制新月形散点图 角落区域2添加噪声不显示问题排查
问题排查结果
- 核心错误是构造区域2、区域1的数据集时,列顺序和原数据集不一致
原数据集g的列顺序为X1、X2、c,但你生成区域2的数据集时写的是data.frame(c,X1,X2),列顺序为c、X1、X2,即使R会尝试按列名匹配,也有概率因类型不一致、环境变量残留等问题导致列值错位,区域2的坐标值被错误填入其他列,自然无法在目标区域显示。 - 第二个错误是
sample函数未指定size参数
除了第一次添加噪声时指定了size=1000,后面两次生成标签c的sample调用都没有加size参数,默认会返回和输入向量等长的结果(此处0:1长度为2,仅生成2个标签),依赖R的向量循环补全长度属于不规范写法,极易引发意外错误。 - 额外的不规范问题:第一次添加噪声时,
sample生成的标签长度为1000,但X1、X2仅生成100个值,会导致坐标值重复循环10次,生成的噪声点不符合预期。
修正后的完整代码
#load library library(RSSL) library(ggplot2) #generate first data d <- generateCrescentMoon(1000,2,1) d$c = ifelse(d$Class == "+", "1","0") d$Class = NULL # 第一次添加噪声:x1∈[-5,0]、x2∈[-10,10] c <- sample(0:1, size=100, replace=TRUE) X1 <- runif(100, min=-5, max=0) X2 <- runif(100, min=-10, max=10) a = data.frame(X1,X2,c) a$c = as.factor(a$c) g = rbind(a,d) #Add noise to Region2:x1∈[5,10]、x2∈[5,10] c <- sample(0:1, size=100, replace=TRUE, prob=c(0.5, 0.5)) X1 <- runif(100, min=5, max=10) X2 <- runif(100, min=5, max=10) # 保持列顺序和原数据集一致 f = data.frame(X1,X2,c) f$c = as.factor(f$c) gg = rbind(g,f) #Add noise to Region1:x1∈[-10,-5]、x2∈[-10,-5] c <- sample(0:1, size=100, replace=TRUE, prob=c(0.5, 0.5)) X1 <- runif(100, min=-10, max=-5) X2 <- runif(100, min=-10, max=-5) f = data.frame(X1,X2,c) f$c = as.factor(f$c) g= rbind(gg,f) #plot ggplot(g, aes(x=X1, y=X2, color=c, shape=c)) + geom_point()
验证方法
运行修正后的代码后,可先运行以下代码确认数据合并正常:
# 查看坐标范围是否覆盖[-10,10] range(g$X1) range(g$X2) # 确认总行数符合预期:1000月牙点+300个噪声点=1300行 nrow(g)
输出符合上述预期的情况下,绘图即可正常显示三个区域的噪声点。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

