2012-03-08 53 views
16

我想知道是否有可能使用geom_line连接缺少的值。例如,在下面的链接中,时间3在F方面缺少值。在这种情况下,我想要一条线来连接时间2和4。有没有办法做到这一点?通过geom_line连接缺少的值

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) 
+0

我曾问一个后续问题:http://stackoverflow.com/questions/27676179/connect-points-across-selected-nas-with-geom-line – PatrickT 2014-12-28 12:08:46

回答

33

Richie的回答是很透彻,但我想展示一些东西简单。由于线条不是绘制到NA点,所以在绘制线条时,另一种方法是删除这些点。这隐含地在点之间进行线性插值(如直线那样)。

从里奇的回答使用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() 
+0

是的!这正是我所寻找的解决方案。现在我的绘图命令是: 'ggplot(cumulative,aes(Time,Value,shape = series))+ geom_point()+ geom_line(data = cumulative [!is.na(cumulative $ Value)],aes(linetype = series))+ facet_wrap(〜individual,ncol = 3)' 而我的图出来是这样的: http://farm8.staticflickr.com/7064/6969423337_125cee3cdd_b.jpg – patabongo 2012-03-10 14:25:22

+0

如果你有多套'y'的?例如y1 = runif(10),y2 = runif(10),y3 = runif(10)...并且所有的y在不同的地方都有NA。这会继续吗? – 2016-08-03 04:50:44

+1

@BenS。然后,您需要使用第一个版本,每行有一个单独的'geom_line'调用,每个调用包含一个'data'参数,该参数删除了'NA'条目。通常情况下,这些类型的图可以通过融合(长格式)数据的'ggplot'更好地处理,但这是一个完全不同的讨论。 – 2016-08-04 21:28:43

11

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

的样本数据:

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() 

如果你是显示这个图给其他人,请确保您清楚地标明通过插值(也许使用虚线)合成数据的地方。


更新基于评论:
您可以指定不同的geoms不同的美感。

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") 
+0

感谢。在这种情况下,我使用geom_point绘制点,然后用geom_line连接它们。这听起来像我不得不使用原始数据框来绘制点,然后使用插值的数据框来绘制线条。 – patabongo 2012-03-08 15:21:14