gpt4 book ai didi

r - 特定值上方和下方的 geom_line 的不同颜色

转载 作者:行者123 更新时间:2023-12-04 17:11:53 26 4
gpt4 key购买 nike

我有以下要绘制的数据框。我想知道是否可以将连接我的结果变量(stackOne$y)的部分线条着色为不同的颜色,具体取决于它是否小于某个值。例如,我希望低于 2.2 的线条部分为红色。

set.seed(123)
stackOne = data.frame(id = rep(c(1, 2, 3), each = 3),
y = rnorm(9, 2, 1),
x = rep(c(1, 2, 3), 3))

ggplot(stackOne, aes(x = x, y = y)) +
geom_point() +
geom_line(aes(group = id))
谢谢!

最佳答案

您在这里至少有几个选择。第一个非常简单、通用(因为它不限于直线段)且精确,但使用基数 plot而不是 ggplot .第二个用途ggplot ,但稍微复杂一些,并且颜色过渡不会 100% 精确(但足够接近,只要您指定适当的分辨率......继续阅读)。

基地:

如果您愿意使用 base绘制函数而不是 ggplot ,您可以将绘图区域裁剪到阈值 (2.2) 以上,然后以您喜欢的颜色绘制线段,然后裁剪到阈值以下的区域,然后再次绘制为红色。虽然第一个剪辑完全没有必要,但它可以防止过度绘制不同的颜色,这可能看起来有点乏味。

threshold <- 2.2
set.seed(123)
stackOne=data.frame(id=rep(c(1,2,3),each=3),
y=rnorm(9,2,1),
x=rep(c(1,2,3),3))
# create a second df to hold segment data
d <- stackOne
d$y2 <- c(d$y[-1], NA)
d$x2 <- c(d$x[-1], NA)
d <- d[-findInterval(unique(d$id), d$id), ] # remove last row for each group

plot(stackOne[, 3:2], pch=20)
# clip to region above the threshold
clip(min(stackOne$x), max(stackOne$x), threshold, max(stackOne$y))
segments(d$x, d$y, d$x2, d$y2, lwd=2)
# clip to region below the threshold
clip(min(stackOne$x), max(stackOne$x), min(stackOne$y), threshold)
segments(d$x, d$y, d$x2, d$y2, lwd=2, col='red')
points(stackOne[, 3:2], pch=20) # plot points again so they lie over lines

base package, changing line colours

ggplot:

如果您想或需要使用 ggplot ,你可以考虑以下...

一种解决方案是使用 geom_line(aes(group=id, color = y < 2.2)) ,但是这将根据每个段开头的点的 y 值分配颜色。我相信您不仅希望在节点处改变颜色,而且希望在任何一条线越过给定阈值 2.2 的地方改变颜色。我对 ggplot 不太熟悉,但实现这一点的一种方法是通过沿着连接现有点的线创建新点来制作更高分辨率版本的数据,然后使用 color = y < 2.2论证以达到预期的效果。

例如:
threshold <- 2.2 # set colour-transition threshold
yres <- 0.01 # y-resolution (accuracy of colour change location)

d <- stackOne # for code simplification
# new cols for point coordinates of line end
d$y2 <- c(d$y[-1], NA)
d$x2 <- c(d$x[-1], NA)
d <- d[-findInterval(unique(d$id), d$id), ] # remove last row for each group
# new high-resolution y coordinates between each pair within each group
y.new <- apply(d, 1, function(x) {
seq(x['y'], x['y2'], yres*sign(x['y2'] - x['y']))
})
d$len <- sapply(y.new, length) # length of each series of points
# new high-resolution x coordinates corresponding with new y-coords
x.new <- apply(d, 1, function(x) {
seq(x['x'], x['x2'], length.out=x['len'])
})
id <- rep(seq_along(y.new), d$len) # new group id vector
y.new <- unlist(y.new)
x.new <- unlist(x.new)
d.new <- data.frame(id=id, x=x.new, y=y.new)

p <- ggplot(d.new, aes(x=x,y=y)) +
geom_line(aes(group=d.new$id, color=d.new$y < threshold))+
geom_point(data=stackOne)+
scale_color_discrete(sprintf('Below %s', threshold))
p

conditional line colour - ggplot

很可能有一种方法可以通过 ggplot 函数来做到这一点,但同时我希望这会有所帮助。我不知道如何画 ggplotGrob成剪裁 viewport (而似乎只是缩放情节)。如果您希望颜色以某个 x 值阈值为条件,这显然需要进行一些调整。

关于r - 特定值上方和下方的 geom_line 的不同颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9543402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com