我正在试图弄清楚是否可以使用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)
答案 0 :(得分:41)
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")