簡體   English   中英

R繪圖中粗線的邊框

[英]Border for thick lines in R plotting

下圖說明了我要在R中實現的目標。藍線是通過簡單調用lines來添加的。 該行顯示了一段時間內參數的一些值。 該行很粗( lwd=3 ),因此可以在低倍縮放時看到它,並且還可以將各個數據點放入其中。 這意味着當在較小的x間隔內出現顫動時,它會與自身重疊。 可以使該線具有邊界以更好地解決重疊區域嗎?

在此處輸入圖片說明

先畫一條粗線,然后再畫一條細線

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

在此處輸入圖片說明

替代。

在此假設下,看到邊界,以便和的“補”頂部的顏色是很重要的,然后從數據庫的出色,速度快,和極簡單的答案借用該路口沒有給出指示其方向是先(左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作為邊界的粗細會更直觀lwd
  • ...參數傳遞到各lines ,除了
  • lend ,它受到嚴格控制,以保持段中線結尾控制器,但允許用戶覆蓋兩端
  • 如果borderfill均為NA ,則不會繪制它們,這將使一個問題產生疑問,為什么使用此功能
  • 根據您的角度,尺寸等,線段中點可能會提示在一個小交匯處,這可以看作是(1.8,3.7)處最左側線段中的提示...這可能消失只是調整大小,我相信這只是柵格圖形的人工產物

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM