使用geom_line连接缺失值

时间:2012-03-08 12:23:48

标签: r ggplot2

我正在试图弄清楚是否可以使用geom_line连接缺失值。例如,在下面的链接中,在方面F的时间3处存在缺失值。在这种情况下,我想要一条连接时间2和4的线。有没有办法实现这个目标?

https://farm8.staticflickr.com/7061/6964089563_b150e0c2a6.jpg

我有一个累积值的数据框,如下所示:

head(cumulative)

  individual series Time     Value
1          A      x    1 -1.008821
2          A      x    2 -2.273712
3          A      x    3 -3.430610
4          A      x    4 -4.618860
5          A      x    5 -4.893075
6          A      x    6 -5.836532

我正在密谋:

ggplot(cumulative, aes(x=Time,y=Value, shape=series)) + 
    geom_point() + 
    geom_line(aes(linetype=series)) + 
    facet_wrap(~ individual, ncol=3)

2 个答案:

答案 0 :(得分:41)

Richie的答案非常彻底,但我想展示更简单的东西。由于线条未绘制到NA个点,因此在绘制线条时,另一种方法是删除这些点。这隐含地在点之间进行线性插值(如直线那样)。

使用Richie的答案中的dfr,无需计算z步骤:

ggplot(dfr, aes(x,y)) + 
  geom_point() +
  geom_line(data=dfr[!is.na(dfr$y),])

就此而言,在这种情况下,可以对整个事情进行子集化。

ggplot(dfr[!is.na(dfr$y),], aes(x,y)) + 
  geom_point() +
  geom_line()

答案 1 :(得分:11)

如果值为NA,则不会绘制线条。您需要通过插入缺失点来替换它们。有许多不同的插值算法,你需要试验几个,看看哪一个最适合你的数据。此示例使用interp1包中的pracma进行线性插值。

示例数据:

dfr <- data.frame(
  x = 1:10,
  y = runif(10)
)
dfr[c(3, 6, 7), "y"] <- NA

插值步骤:

dfr$z <- with(dfr, interp1(x, y, x, "linear"))

比较情节:

ggplot(dfr, aes(x, y)) + geom_line()
ggplot(dfr, aes(x, z)) + geom_line()

如果您向其他人显示此图表,请确保通过插值(可能使用虚线)清楚地标记合成数据的位置。


根据评论更新:
您可以为不同的宝石指定不同的美学。

ggplot(dfr, aes(x)) + 
  geom_point(aes(y = y)) +
  geom_line(aes(y = z))

要为缺失/不缺少的y合并不同的线型,您可以执行类似

的操作
ggplot(dfr, aes(x)) + 
  geom_point(aes(y = y)) +
  geom_line(aes(y = y)) +
  geom_line(aes(y = z), linetype = "dotted")