По предложению @ thelatemail, я решил сделать мой редактировать в ответ. Мое решение основано на ответе @ thelatemail.
я написал небольшую функцию, чтобы рисовать кривые, что делает использование логистической функции:
#Create the function
curveMaker <- function(x1, y1, x2, y2, ...){
curve(plogis(x, scale = 0.08, loc = (x1 + x2) /2) * (y2-y1) + y1,
x1, x2, add = TRUE, ...)
}
рабочий пример ниже. В этом примере я хочу создать график для таксономии с тремя уровнями: parent
->2 children
->20 grandchildren
. У одного ребенка есть 12 внуков, а у другого ребенка 8 детей.
#Prepare data:
parent <- c(1, 16)
children <- cbind(2, c(8, 28))
grandchildren <- cbind(3, (1:20)*2-1)
labels <- c("Parent ", paste("Child ", 1:2), paste(" Grandchild", 1:20))
#Make a blank plot canvas
plot(0, type="n", ann = FALSE, xlim = c(0.5, 3.5), ylim = c(0.5, 39.5), axes = FALSE)
#Plot curves
#Parent and children
invisible(mapply(curveMaker,
x1 = parent[ 1 ],
y1 = parent[ 2 ],
x2 = children[ , 1 ],
y2 = children[ , 2 ],
col = gray(0.6, alpha = 0.6), lwd = 1.5))
#Children and grandchildren
invisible(mapply(curveMaker,
x1 = children[ 1, 1 ],
y1 = children[ 1, 2 ],
x2 = grandchildren[ 1:8 , 1 ],
y2 = grandchildren[ 1:8, 2 ],
col = gray(0.6, alpha = 0.6), lwd = 1.5))
invisible(mapply(curveMaker,
x1 = children[ 2, 1 ],
y1 = children[ 2, 2 ],
x2 = grandchildren[ 9:20 , 1 ],
y2 = grandchildren[ 9:20, 2 ],
col = gray(0.6, alpha = 0.6), lwd = 1.5))
#Plot text
text(x = c(parent[1], children[,1], grandchildren[,1]),
y = c(parent[2], children[,2], grandchildren[,2]),
labels = labels,
pos = rep(c(2, 4), c(3, 20)))
#Plot points
points(x = c(parent[1], children[,1], grandchildren[,1]),
y = c(parent[2], children[,2], grandchildren[,2]),
pch = 21, bg = "white", col="#3182bd", lwd=2.5, cex=1)
Это хороший редактировать! Я мог бы украсть это на самом деле. Вы должны сделать свое редактирование ответом и принять его самостоятельно - безусловно, достойный upvote или 3. – thelatemail
@thelatemail: Спасибо за предложение. Я добавил свой ответ и включил чуть более подробный пример. – Alex