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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 04:07:33