如何在R的散点图中展示含NA值的Secchi与Hue Angle数据
解决方案:保留含NA数据的散点图绘制
要在不替换NA的前提下展示所有数据点,核心是避免ggplot因美学映射变量存在NA而过滤掉对应行。这里提供两种直接可行的方法:
方法1:分层绘制散点
分别绘制非NA数据点(保留完整美学映射)和含NA的数据点(设置统一样式),既保留变量映射信息,又能展示所有样本位置:
final_updated_4 <- read.csv("final_updated_4.csv") ggplot(final_updated_4, aes(x = hue_angle, y = Secchi)) + # 绘制含NA的点,设置统一样式(灰色空心点,固定大小) geom_point(data = subset(final_updated_4, is.na(Wave.height) | is.na(Sun) | is.na(Wind.speed)), shape = 21, color = "grey50", fill = "transparent", size = 3) + # 绘制非NA的点,保留原有的美学映射 geom_point(data = subset(final_updated_4, !is.na(Wave.height) & !is.na(Sun) & !is.na(Wind.speed)), aes(shape = Sun, color = Wave.height, size = Wind.speed)) + ylab("Secchi") + xlab("Hue Angle") + scale_color_gradientn(colours = rainbow(10), oob = scales::squish) + geom_abline(yintercept = 0, slope = 1, linetype = "dashed") + theme(legend.background = element_rect(fill = "grey60"), legend.text = element_text(size = 12), legend.title = element_text(size = 12), legend.key.size = unit(1.0, "cm")) + geom_smooth(method = "lm") + # 修正原代码的语法错误:括号位置调整 stat_poly_eq(formula = y~x, aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~")), parse = TRUE, rr.digits = 5)
方法2:在美学映射中处理NA值
不修改原始数据,直接在映射时给NA值指定固定标识,再通过scale参数设置样式:
final_updated_4 <- read.csv("final_updated_4.csv") ggplot(final_updated_4, aes(x = hue_angle, y = Secchi)) + geom_point(aes(shape = ifelse(is.na(Sun), "NA", as.character(Sun)), color = ifelse(is.na(Wave.height), "NA", Wave.height), size = ifelse(is.na(Wind.speed), 2, Wind.speed))) + ylab("Secchi") + xlab("Hue Angle") + scale_color_gradientn(colours = rainbow(10), oob = scales::squish, limits = range(final_updated_4$Wave.height, na.rm = TRUE), na.value = "grey50") + # 给NA的color设置灰色 scale_shape_discrete(na.value = 21) + # 给NA的shape设置空心点 scale_size_continuous(na.value = 3) + # 给NA的size设置固定大小 geom_abline(yintercept = 0, slope = 1, linetype = "dashed") + theme(legend.background = element_rect(fill = "grey60"), legend.text = element_text(size = 12), legend.title = element_text(size = 12), legend.key.size = unit(1.0, "cm")) + geom_smooth(method = "lm") + stat_poly_eq(formula = y~x, aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~")), parse = TRUE, rr.digits = 5)
说明
- 方法1逻辑更清晰,将两类点分开控制,适合需要明确区分NA样本的场景。
- 方法2仅需一层geom_point,通过scale参数统一处理NA的样式,适合希望NA样本融入现有图例的场景。
- 原代码中
stat_poly_eq存在语法错误(括号位置错误),已在上述代码中修正。
内容的提问来源于stack exchange,提问作者Mizanur Rahman
相关产品推荐
相关产品推荐

