[英]Border for thick lines in R plotting
替代。
在此假設下,看到邊界,以便和的“補”頂部的顏色是很重要的,然后從數據庫的出色,速度快,和極簡單的答案借用該路口沒有給出指示其方向是先(左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
,它受到嚴格控制,以保持段中線結尾控制器,但允許用戶覆蓋兩端 border
或fill
均為NA
,則不會繪制它們,這將使一個問題產生疑問,為什么使用此功能
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.