r - ggplot2 中仅连接连续数据的绘图线

标签 r ggplot2

我正在绘制一个时间序列,其中我通过因子变量映射颜色。我遇到的问题是,不同的因子级别位于整个数据的离散时间窗口中,因此对于给定的因子,一个窗口的末尾由一条线连接到另一个窗口的开头。这条线穿过两个窗口之间绘制的不同因素。我已经更改了 geom_line()geom_point()没关系,但我更喜欢有线条。这是创建示例数据框的代码。

#Create dataframe
df <- data.frame(cbind(
t= c(1361347202,1361347212,1361347222,1361347232,1361347242,1361347252,1361347262), 
y = runif(7,1,5),
l =c(1,1,1,2,2,1,1)))
df$l = as.factor(df$l)

这是绘图命令,
ggplot(df, aes(x = t, y=y, colour = factor(l)))+geom_line()

我希望红色线在第 3 点停止,然后在第 6 点重新开始。另外,我认为这并不重要,但 x 值实际上是 POSIX 变量 - 我刚刚将它们转换为这个问题的数值。谢谢

最佳答案

您必须修改group审美 geom_path .

ind <- as.numeric(df$l[-1]) - as.numeric(df$l[-nrow(df)]) != 0
splitAt <- function(x, pos) split(x, cumsum(seq_along(x) %in% (pos+1)))
l1 <- splitAt(as.numeric(df$l), which(ind))
names(l1) <- 1:length(l1)
l2 <- lapply(seq_along(l1), 
             function(y, n, i) {
                                 as.numeric(rep(n[[i]], length(y[[i]]))) 
                               }, y=l1, n=names(l1))
ggplot(df, aes(x = t, y=y, colour = l)) + 
  geom_point() +
  geom_path(aes(group=unlist(l2)))

enter image description here

这是一个简短的解释。首先,我们应该找到分组索引以将它们用作 group AES。我假设一个组由几个连续的红点或蓝点组成。所以,ind指示应该出现换行符的位置。然后,我们应该构建一个分组变量,看起来像(对于您的示例)c(1, 1, 1, 2, 2, 3, 3) ,这将显示哪些点相互连接。我分两步执行此操作:首先将变量除以 ind并将其存储在 l1 ,然后简单地替换 l1 中的值以便 i列表中的第 th 个节点只包含值,等于 i .结果存储在 l2看起来像这样:
[[1]]
[2] 1 1 1

[[2]]
[3] 2 2

[[3]]
[4] 3 3

通过 unlist 将其转换为向量完成它,我们就完成了。我的答案与@AndreSilva 提供的答案之间的区别在于我们如何处理从一种颜色到另一种颜色的过渡。我的答案看起来更难,因为我必须以准确的方式指定组,这需要一些中间步骤。这是他对相同数据的情节:

enter image description here

关于r - ggplot2 中仅连接连续数据的绘图线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23835692/

相关文章:

r - 按组在设定函数中创建滞后

R Shiny app sliderInput 控制 GGplot 中的 x 轴

r - 使用滑动窗口制作 ggplot 时间序列图动画

r - 为什么我不能在 ifelse() 中使用 element_text()?

r - 如何使用 ggplot 获得真正周期性的极地表面图

r - 当缺少结果时,使用 nlme 正确建模纵向相关性 (R)

r - 将函数应用于向量,条件是为负值引入 0(并且不应用函数)?

r - 如何将序列拆分为 k 个同质部分?

r - 如何修复 R 中 ggplot2 的 geom_jitter() 不稳定的 y 位置?

r - 使用 NVD3 在 R 的 rCharts 中绘制对数刻度