我正在绘制一个时间序列,其中我通过因子变量映射颜色。我遇到的问题是,不同的因子级别位于整个数据的离散时间窗口中,因此对于给定的因子,一个窗口的末尾由一条线连接到另一个窗口的开头。这条线穿过两个窗口之间绘制的不同因素。我已经更改了 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)))
这是一个简短的解释。首先,我们应该找到分组索引以将它们用作
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 提供的答案之间的区别在于我们如何处理从一种颜色到另一种颜色的过渡。我的答案看起来更难,因为我必须以准确的方式指定组,这需要一些中间步骤。这是他对相同数据的情节:关于r - ggplot2 中仅连接连续数据的绘图线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23835692/