2012-03-08 106 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