下面的图片解释了我想在R中实现的目标。通过简单调用lines
来添加蓝线。该行显示了一段时间内参数的一些值。该线是粗线(lwd=3
),因此可以在低倍缩放时看到它,并且各个数据点都适合其中。这意味着当在较小的x间隔内出现颤动时,它会与自身重叠。可以使该线条具有边界以更好地解析重叠区域吗?
答案 0 :(得分:2)
先画一条粗线,然后再在上面画细线
set.seed(42)
x = 1:10
y = sample(1:10)
plot(x, y, type = "l", lwd = 5, col = "red")
lines(x, y, lwd = 3, col = "green")
答案 1 :(得分:2)
替代方法。
在以下前提下,假设依次看到边框 和在“填充”颜色之上很重要,然后借鉴db的出色,快速且非常简单的答案,即交集不显示任何指示哪个方向先出现(3个包装的左侧,如下)。
更改的数据,以显示重叠的内容:
set.seed(42)
x <- sample(10)
y <- sample(10)
一种解决方案是分别绘制每个段,每次都控制颜色。
segments2 <- function(x, y, lwd = c(2, 1), ..., border = NA, fill = NA) {
stopifnot(length(x) == length(y))
len <- length(x)
ign <- Map(function(x0, y0, x1 = x0, y1 = y0) {
if (!is.na(border)) lines(c(x0, x1), c(y0, y1), lwd = lwd[1], col = border, ...)
if (!is.na(fill)) lines(c(x0, x1), c(y0, y1), lwd = lwd[2], col = fill, ...)
}, x[-len], y[-len], x[-1], y[-1])
invisible()
}
这将产生下面的中间图,但是请注意,每个顶点都有边界侵入。第三种选择,复杂得多,可以通过很多技巧来缓解这种情况。
segments3 <- function(x, y, lwd = c(2, 1), ..., border = NA, fill = NA, lend = 0) {
stopifnot(length(x) == length(y))
len <- length(x)
dx <- x[-len] + diff(x) / 2
mx <- rbind(
c(NA, x[1], dx[1]),
cbind(dx[-(len-1)], x[-c(1,len)], dx[-c(1)]))
mx <- rbind(
mx[-(len-1),],
c(x[len], dx[len-1], NA),
mx[len-1,])
dy <- y[-len] + diff(y) / 2
my <- rbind(
c(NA, y[1], dy[1]),
cbind(dy[-(len-1)], y[-c(1,len)], dy[-c(1)]))
my <- rbind(
my[-(len-1),],
c(y[len], dy[len-1], NA),
my[len-1,])
for (rn in seq_len(nrow(mx))) {
lend0 <- if (rn %in% c(1L, len-1)) lend else 1
lines(mx[rn,], my[rn,], lwd = lwd[1], col = border, ..., lend = lend0)
lines(mx[rn,], my[rn,], lwd = lwd[2], col = fill, ..., lend = lend0)
}
}
可能可以简化此操作,但是它的性能并不令人讨厌,并且确实可以绘制出更清晰的图。
par(mfrow=c(1, 3))
# simpler method
plot(x, y, type = "l", lwd = 5, col = "red", main = "Simpler")
lines(x, y, lwd = 3, col = "green")
# slower method, full-size
plot(x, y, type = "n", main = "Slower")
segments2(x, y, lwd = c(5, 3), border="red", fill="green")
# slowest method, fairly complex
plot(x, y, type = "n", main = "Slowest")
segments3(x, y, lwd = c(5, 3), border="red", fill="green")
一些注意事项:
lwd
是一个长度为2的矢量,用于控制两条线的宽度;也许以lwd
作为主线,以border.lwd
作为边界的粗细会更直观?...
参数传递给lines
,除了lend
,受到严格控制,以保持中段行尾控制器,但允许用户覆盖两端border
或fill
是NA
,那么它们将不会被绘制,这将引起一个问题,为什么使用此功能