I'm trying to figure out if it's possible to connect across missing values using geom_line. For example, in the link below there are missing values at time 3 in facet F. I'd like a line to connect time 2 and 4 in that case. Is there a way to achieve this?
https://farm8.staticflickr.com/7061/6964089563_b150e0c2a6.jpg
I have a data frame of cumulative values like so:
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
Which I'm plotting with:
ggplot(cumulative, aes(x=Time,y=Value, shape=series)) +
geom_point() +
geom_line(aes(linetype=series)) +
facet_wrap(~ individual, ncol=3)
Lines aren't drawn if a value is
NA
. You need to replace these by interpolating across missing points. There are many different algorithms for interpolation, you need to experiment with several and see which one suits your data best. This example uses linear interpolation viainterp1
in thepracma
package.Sample data:
Interpolation step:
Compare plots:
If you are showing this graph to other people, make sure that you clearly mark the places where you've synthesised data by interpolating (maybe using dotted lines).
Update based on comment:
You can specify different aesthetics for different geoms.
To incorporate different line types for missing/non-missing y, you can do something like
Richie's answer is very thorough, but I wanted to show something simpler. Since lines are not drawn to
NA
points, another approach is drop these points when drawing lines. This implicitly makes a linear interpolation between points (as straight lines do).Using
dfr
from Richie's answer, without needing the calculation ofz
step:For that matter, in this case the subsetting could be done for the whole thing.