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

如何忽略#VALUE!并让ggplot中的线段连续连接?

问题描述

我尝试用geom_line()将数据点按时间用线段连接,原始数据和使用的代码如下:

原始数据

df<-structure(list(Bloc = c(6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6), Pos_heliaphen = c("X46", "X47", "X46", "X47", "X46", "X47", "X46", "X47", "X46", "X47", "X46", "X47", "X46", "X47", "X46", "X47", "X46", "X47", "X46", "X47", "X46", "X47", "X46", "X47", "X46", "X47", "X46", "X47", "X46", "X47"), traitement = c("WS", "WW", "WS", "WW", "WS", "WW", "WS", "WW", "WS", "WW", "WS", "WW", "WS", "WW", "WS", "WW", "WS", "WW", "WS", "WW", "WS", "WW", "WS", "WW", "WS", "WW", "WS", "WW", "WS", "WW"), Variete = c("Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas", "Blancas"), Date_obs = c("26/05/2021", "26/05/2021", "27/05/2021", "27/05/2021", "28/05/2021", "28/05/2021", "31/05/2021", "31/05/2021", "01/06/2021", "01/06/2021", "04/06/2021", "04/06/2021", "07/06/2021", "07/06/2021", "08/06/2021", "08/06/2021", "09/06/2021", "09/06/2021", "10/06/2021", "10/06/2021", "11/06/2021", "11/06/2021", "14/06/2021", "14/06/2021", "15/06/2021", "15/06/2021", "16/06/2021", "16/06/2021", "18/06/2021", "18/06/2021"), FTSW_av_arros = c(0.916282724383014, 0.92943692088382, NA, NA, 0.867138112075431, 0.890235210263721, NA, NA, NA, NA, NA, NA, 0.848566020215008, 0.828225231646472, NA, NA, 0.797135611986142, 0.76407697790449, NA, NA, 0.654273366905961, 0.714183891660727, 0.427122397228472, 0.59871703492516, NA, NA, 0.231401121468624, 0.632929436920884, 0.138540662166506, 0.744119743406985), FTSW_apres_arros = c(0.916282724383014, 0.92943692088382, NA, NA, 0.899853566198793, 0.899215965787598, NA, NA, NA, NA, NA, NA, 0.899996428443873, 0.899501069137562, NA, NA, 0.797135611986142, 0.902352102637206, NA, NA, 0.654273366905961, 0.899501069137562, 0.427122397228472, 0.909479686386315, NA, NA, 0.231401121468624, 0.899501069137562, 0.138540662166506, 0.903777619387028)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -30L))

绘图代码

library(ggplot2)
library(dplyr)
library(readxl)
library(scales)
library(tidyverse)
library(lubridate)

Blancas<-subset(df, Variete %in% c("Blancas"))
labels <- Blancas %>% 
  select(Bloc, Pos_heliaphen) %>% 
  distinct(Bloc, Pos_heliaphen) %>% 
  group_by(Bloc) %>% 
  summarise(Pos_heliaphen = paste(Pos_heliaphen, collapse = "-")) %>% 
  tibble::deframe()

p1<-
  Blancas %>%
  mutate(Date_obs = as.POSIXct(lubridate::dmy(Date_obs))) %>%
  tidyr::pivot_longer(starts_with("FTSW")) %>%
  mutate(Date_obs = if_else(name == "FTSW_apres_arros", 
                            Date_obs + 43200, Date_obs)) %>%
  ggplot(aes(Date_obs, value, colour = factor(Bloc), shape = traitement, 
             linetype = traitement, group = interaction(Bloc, traitement))) +
  geom_point() +
  geom_line() +
  scale_color_discrete(labels = labels, guide = guide_legend(order = 1)) +
  scale_x_datetime(date_labels = "%d/%m/%Y", date_breaks = "day") +
  labs(y = expression(paste("FTSW"))) +
  theme(legend.position = "right", 
        axis.text.x = element_text(angle = 90, hjust = 1))+
  labs(title = "Blancas",
       y = expression(paste("FTSW"))) +
  theme(legend.position = "right", axis.text.x = element_text(angle = 90, hjust = 1), axis.title.x=element_blank())+
  guides(colour = guide_legend(order = 1,nrow = 8),shape=guide_legend(nrow = 2),linetype=guide_legend(nrow = 2))
p1

当前生成的图表因数据中存在大量NA(对应描述的#VALUE!),导致部分线段无法随时间连续连接。我期望实现线段连续的效果,请问在不删除NA的前提下能否达成该需求?


解决方案

可以实现,核心是让绘图逻辑忽略NA值,直接连接同一分组内的非NA数据点,同时保留原始数据中的NA。以下两种方法都能满足需求:

方法1:使用geom_line()的na.rm = TRUE参数

这是最直接的方式,在geom_line()中添加该参数后,会自动跳过NA值,将同一组内的有效数据点连续连接,且不会修改原始数据。

修改后的绘图核心代码:

ggplot(aes(Date_obs, value, colour = factor(Bloc), shape = traitement, 
           linetype = traitement, group = interaction(Bloc, traitement))) +
  geom_point() +
  geom_line(na.rm = TRUE) +  # 添加此参数实现连续连接
  scale_color_discrete(labels = labels, guide = guide_legend(order = 1)) +
  scale_x_datetime(date_labels = "%d/%m/%Y", date_breaks = "day") +
  labs(y = expression(paste("FTSW"))) +
  theme(legend.position = "right", 
        axis.text.x = element_text(angle = 90, hjust = 1))+
  labs(title = "Blancas",
       y = expression(paste("FTSW"))) +
  theme(legend.position = "right", axis.text.x = element_text(angle = 90, hjust = 1), axis.title.x=element_blank())+
  guides(colour = guide_legend(order = 1,nrow = 8),shape=guide_legend(nrow = 2),linetype=guide_legend(nrow = 2))

方法2:为线段单独过滤非NA数据

如果需要更灵活的控制,可以在geom_line()中指定仅使用过滤掉NA的子集数据绘图,原始数据依然保持完整。

修改后的绘图核心代码:

ggplot(aes(Date_obs, value, colour = factor(Bloc), shape = traitement, 
           linetype = traitement, group = interaction(Bloc, traitement))) +
  geom_point() +
  # 仅用非NA数据绘制线段,不修改原始数据集
  geom_line(data = . %>% filter(!is.na(value))) +
  scale_color_discrete(labels = labels, guide = guide_legend(order = 1)) +
  scale_x_datetime(date_labels = "%d/%m/%Y", date_breaks = "day") +
  labs(y = expression(paste("FTSW"))) +
  theme(legend.position = "right", 
        axis.text.x = element_text(angle = 90, hjust = 1))+
  labs(title = "Blancas",
       y = expression(paste("FTSW"))) +
  theme(legend.position = "right", axis.text.x = element_text(angle = 90, hjust = 1), axis.title.x=element_blank())+
  guides(colour = guide_legend(order = 1,nrow = 8),shape=guide_legend(nrow = 2),linetype=guide_legend(nrow = 2))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:40:25