如何忽略#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
相关产品推荐
相关产品推荐

