如何在 R 中用 Lattice 绘制线段或箭头? (来自宽格式数据集)
How to plot segments or arrows with Lattice in R? (from a Wide format dataset)
我想创建一个带有分段或箭头的图。
假设我有这个玩具示例
temp <- data.frame(posi=c(1,2,3,3,2,1,5), from=c("A", "B", "C", "D", "D", "B", "A"),
to=c( "C", "D", "D", "C", "A", "A", "B"))
posi from to
1 A C
2 B D
3 C D
3 D C
2 D A
1 B A
5 A B
我想绘制从 "from" 定义的点及其起始位置到 "to" 和 position+1.
定义的点的线段或箭头
我必须使用 ggplot 创建情节
ggplot() + geom_point(data=temp, aes(x=posi, y=from, size=10),show.legend = FALSE) +
geom_point(data=temp, aes(x=posi+1, y=to, size=10),show.legend = FALSE) +
geom_segment(data=temp, aes(x=posi, y=from, xend=posi+1, yend=to),
arrow=arrow(type="closed", angle=10), size=1.5, color="blue") + theme_bw()
但我想用 Lattice 来做,因为我的真实数据集要大得多(数百万行)并且 lattice 工作得更快。
我知道我可以减少删除重复项的行数,但那是另一回事了。
我怎样才能用格子做?
我一直在研究,我认为我需要使用 panel.segments 或 lsegments,但事情似乎要复杂得多,而且很难找到示例。
xyplot(from ~ posi , type="p", col="black", data=temp, pch=16,
panel = function(x, y, ...){ panel.segments(x,y,) })
我不知道在函数里面和面板里面写什么参数。
您可以使用以下代码:
xyplot(from ~ posi , type="p", col="black", data=temp, pch=16, xlim = c(0,7),
panel = function(...){
panel.dotplot(x = (temp$posi+1), y = temp$to, col="black", cex=1.4)
panel.dotplot(x = temp$posi, y = temp$from, col ="black", cex=1.4)
panel.arrows(x0 = temp$posi, y0 = temp$from, x1 = temp$posi+1, y1 = temp$to, lwd=3, col="blue", )
}
)
生成下图:
请告诉我这是否是您想要的。
更新
我发布了一个关于@skan 在评论中识别和描述的问题的问题:当 "extreme" 级别(如 "D")在 temp$from
中不存在时,[= =47=] 不会成为图表的一部分,即使稍后 temp$to
需要 "D" 也是如此。可以找到@Konn 回答的问题 .
据我现在的理解,我们需要一个 factor
即 ordered
,并且我们需要在对 xyplot
的调用中指定 drop.unused.levels = FALSE
的代码中添加一个.在示例中,我们在 "from" 中显示 "extremes" 的完整集,并作为不存在极端 "D" 的子集:完整代码为:
l <- c("A", "B", "C", "D")
temp <- data.frame(posi = c(1, 2, 3, 3, 2),
from= factor(c("A", "B", "C", "D", "D"), levels = l, ordered = TRUE),
to = factor(c("C", "D", "D", "C", "A"), levels = l, ordered = TRUE)
)
xyplot(from ~ posi , type="p", col="black", data=temp, pch=16, xlim = c(0,7),
drop.unused.levels = FALSE, ## the added code
panel = function(...){
panel.dotplot(x = temp$posi, y = temp$from, col ="green", cex=1.6)
panel.dotplot(x = (temp$posi+1), y = temp$to, col="black", cex=1.)
panel.arrows(x0 = temp$posi, y0 = temp$from, x1 = temp$posi+1, y1 = temp$to, lwd=2, col="blue" )
})
temp <- temp[1:3, ]
xyplot(from ~ posi , type="p", col="black", data=temp, pch=16, xlim = c(0,7),
drop.unused.levels = FALSE, ## the added code
panel = function(...){
panel.dotplot(x = temp$posi, y = temp$from, col ="green", cex=1.6)
panel.dotplot(x = (temp$posi+1), y = temp$to, col="black", cex=1.)
panel.arrows(x0 = temp$posi, y0 = temp$from, x1 = temp$posi+1, y1 = temp$to, lwd=2, col="blue" )
})
生成以下图片:
我想我们已经解决了这个问题。
我想创建一个带有分段或箭头的图。
假设我有这个玩具示例
temp <- data.frame(posi=c(1,2,3,3,2,1,5), from=c("A", "B", "C", "D", "D", "B", "A"),
to=c( "C", "D", "D", "C", "A", "A", "B"))
posi from to
1 A C
2 B D
3 C D
3 D C
2 D A
1 B A
5 A B
我想绘制从 "from" 定义的点及其起始位置到 "to" 和 position+1.
定义的点的线段或箭头我必须使用 ggplot 创建情节
ggplot() + geom_point(data=temp, aes(x=posi, y=from, size=10),show.legend = FALSE) +
geom_point(data=temp, aes(x=posi+1, y=to, size=10),show.legend = FALSE) +
geom_segment(data=temp, aes(x=posi, y=from, xend=posi+1, yend=to),
arrow=arrow(type="closed", angle=10), size=1.5, color="blue") + theme_bw()
但我想用 Lattice 来做,因为我的真实数据集要大得多(数百万行)并且 lattice 工作得更快。 我知道我可以减少删除重复项的行数,但那是另一回事了。
我怎样才能用格子做?
我一直在研究,我认为我需要使用 panel.segments 或 lsegments,但事情似乎要复杂得多,而且很难找到示例。
xyplot(from ~ posi , type="p", col="black", data=temp, pch=16,
panel = function(x, y, ...){ panel.segments(x,y,) })
我不知道在函数里面和面板里面写什么参数。
您可以使用以下代码:
xyplot(from ~ posi , type="p", col="black", data=temp, pch=16, xlim = c(0,7),
panel = function(...){
panel.dotplot(x = (temp$posi+1), y = temp$to, col="black", cex=1.4)
panel.dotplot(x = temp$posi, y = temp$from, col ="black", cex=1.4)
panel.arrows(x0 = temp$posi, y0 = temp$from, x1 = temp$posi+1, y1 = temp$to, lwd=3, col="blue", )
}
)
生成下图:
请告诉我这是否是您想要的。
更新
我发布了一个关于@skan 在评论中识别和描述的问题的问题:当 "extreme" 级别(如 "D")在 temp$from
中不存在时,[= =47=] 不会成为图表的一部分,即使稍后 temp$to
需要 "D" 也是如此。可以找到@Konn 回答的问题
据我现在的理解,我们需要一个 factor
即 ordered
,并且我们需要在对 xyplot
的调用中指定 drop.unused.levels = FALSE
的代码中添加一个.在示例中,我们在 "from" 中显示 "extremes" 的完整集,并作为不存在极端 "D" 的子集:完整代码为:
l <- c("A", "B", "C", "D")
temp <- data.frame(posi = c(1, 2, 3, 3, 2),
from= factor(c("A", "B", "C", "D", "D"), levels = l, ordered = TRUE),
to = factor(c("C", "D", "D", "C", "A"), levels = l, ordered = TRUE)
)
xyplot(from ~ posi , type="p", col="black", data=temp, pch=16, xlim = c(0,7),
drop.unused.levels = FALSE, ## the added code
panel = function(...){
panel.dotplot(x = temp$posi, y = temp$from, col ="green", cex=1.6)
panel.dotplot(x = (temp$posi+1), y = temp$to, col="black", cex=1.)
panel.arrows(x0 = temp$posi, y0 = temp$from, x1 = temp$posi+1, y1 = temp$to, lwd=2, col="blue" )
})
temp <- temp[1:3, ]
xyplot(from ~ posi , type="p", col="black", data=temp, pch=16, xlim = c(0,7),
drop.unused.levels = FALSE, ## the added code
panel = function(...){
panel.dotplot(x = temp$posi, y = temp$from, col ="green", cex=1.6)
panel.dotplot(x = (temp$posi+1), y = temp$to, col="black", cex=1.)
panel.arrows(x0 = temp$posi, y0 = temp$from, x1 = temp$posi+1, y1 = temp$to, lwd=2, col="blue" )
})
生成以下图片:
我想我们已经解决了这个问题。