R绘图中粗线的边框

时间:2019-09-16 00:44:56

标签: r plot

下面的图片解释了我想在R中实现的目标。通过简单调用lines来添加蓝线。该行显示了一段时间内参数的一些值。该线是粗线(lwd=3),因此可以在低倍缩放时看到它,并且各个数据点都适合其中。这意味着当在较小的x间隔内出现颤动时,它会与自身重叠。可以使该线条具有边界以更好地解析重叠区域吗?

enter image description here

2 个答案:

答案 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")

enter image description here

答案 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")

three pack of various alternatives

一些注意事项:

  • lwd是一个长度为2的矢量,用于控制两条线的宽度;也许以lwd作为主线,以border.lwd作为边界的粗细会更直观?
  • ...参数传递给lines,除了
  • lend,受到严格控制,以保持中段行尾控制器,但允许用户覆盖两端
  • 如果borderfillNA,那么它们将不会被绘制,这将引起一个问题,为什么使用此功能
  • 根据您的视角,尺寸等,线段中点可能会提示一个小交汇点,这可以看作是(1.8,3.7)附近最左侧线段中的提示...可以调整大小而消失,我相信一般来说只是栅格图形的伪像