【问题标题】:Connecting across missing values with geom_line使用 geom_line 连接缺失值
【发布时间】:2012-03-08 12:23:47
【问题描述】:

我正在尝试确定是否可以使用 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)

【问题讨论】:

标签: r ggplot2


【解决方案1】:

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

【讨论】:

  • 是的!这正是我正在寻找的解决方案。现在我的绘图命令是: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) 我的图表看起来像:farm8.staticflickr.com/7064/6969423337_125cee3cdd_b.jpg
  • 如果您有多个y 怎么办?例如y1 = runif(10), y2 = runif(10), y3=runif(10)... 并且所有 y 在不同的地方都有 NA。这还能用吗?
  • @BenS。然后你需要使用第一个版本,对每一行单独调用geom_line,并且每行都包含一个data 参数,该参数删除了NA 条目。通常,ggplot 可以更好地处理这些类型的图表,其中包含融化的(长格式)数据,但这是一个完全不同的讨论。
  • 也可以gather在plot前的不同行再过滤。类似cumulative %>% gather("y_key", "y_val", y1:y4) %>% filter(!is.na(y_val)) %>% ggplot(aes(x, y_val, color = y_key)) + geom_line() + ...
【解决方案2】:

如果值为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()

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


根据评论更新:
您可以为不同的几何图形指定不同的美学。

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

【讨论】:

  • 谢谢。在这种情况下,我使用 geom_point 绘制点,然后将它们与 geom_line 连接起来。听起来我必须使用原始数据框来绘制点,然后使用带有插值的数据框来绘制线条。
猜你喜欢
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 2018-03-27
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
相关资源
最近更新 更多