这里有两种解决方案:一种是将所有数据绘制在一起,按颜色区分;另一种是按不同方面的情况分别绘制它们。原理大致相同:我使用approx 进行线性插值,将数据从宽到长重新格式化,以便在ggplot2 中绘制,然后绘制它。在第二个解决方案中,我还创建了一个名为 type 的新变量来区分插值数据和原始数据。
一起绘制
# Create data frame
df <- data.frame("time" = c(1,2,3,4,5),
"case1" = c(NA,2,3,4,NA),
"case2" = c(1,2,3,4,NA),
"case3" = c(1,NA,NA,NA,5))
# Perform interpolation on all columns
# Switch from wide to long format
df %<>%
mutate_at(vars(contains("case")), funs(interp = approx(time, ., xout = time)$y)) %>%
gather(var, val, -time)
# Plot results all in one figure
g <- ggplot()
g <- g + geom_point(data = df %>% filter(!grepl("interp", var)), aes(x = time, y = val, colour = var))
g <- g + geom_line(data = df %>% filter(grepl("interp", var)), aes(x = time, y = val, colour = var))
print(g)
单独绘制
# Create data frame
df <- data.frame("time" = c(1,2,3,4,5),
"case1" = c(NA,2,3,4,NA),
"case2" = c(1,2,3,4,NA),
"case3" = c(1,NA,NA,NA,5))
# Perform interpolation on all columns
# Switch from wide to long format
# Create column to indicate whether raw or interpolated
# Strip "_interp" from var
df %<>%
mutate_at(vars(contains("case")), funs(interp = approx(time, ., xout = time)$y)) %>%
gather(var, val, -time) %>%
mutate(type = ifelse(grepl("interp", var), "interp", "raw"),
var = gsub("_.*", "", var))
# Plot results all separate figures
g <- ggplot()
g <- g + geom_point(data = df %>% filter(type == "raw"), aes(x = time, y = val))
g <- g + geom_line(data = df %>% filter(type == "interp"), aes(x = time, y = val))
g <- g + facet_grid(var ~.)
print(g)
用新的数据框编辑
df <- data.frame("time" = c(1,2,3,4,5),
"case1" = c(NA,2,3,4,NA),
"case2" = c(5,4,3,2,NA),
"case3" = c(4,NA,NA,NA,2))
df %<>%
mutate_at(vars(contains("case")), funs(interp = approx(time, ., xout = time)$y)) %>%
gather(var, val, -time) %>%
mutate(type = ifelse(grepl("interp", var), "interp", "raw"),
var = gsub("_.*", "", var))
g <- ggplot()
g <- g + geom_point(data = df %>% filter(type == "raw"), aes(x = time, y = val, colour = var))
g <- g + geom_line(data = df %>% filter(type == "interp"), aes(x = time, y = val, colour = var))
print(g)