Tiếp theo đề nghị @ thelatemail, tôi quyết định làm chỉnh sửa của tôi vào một câu trả lời. Giải pháp của tôi dựa trên câu trả lời của @ thelatemail.
Tôi đã viết một chức năng nhỏ để vẽ đường cong, mà làm cho việc sử dụng chức năng hậu cần:
#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, ...)
}
Một ví dụ làm việc ở dưới. Trong ví dụ này, tôi muốn tạo một âm mưu phân loại với 3 cấp độ: parent
->2 children
->20 grandchildren
. Một đứa trẻ có 12 đứa cháu, và đứa kia có 8 đứa con.
#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)
Đó là một chỉnh sửa tốt đẹp! Tôi có thể ăn cắp điều này trong thực tế. Bạn nên chỉnh sửa câu trả lời của mình và tự chấp nhận câu trả lời - chắc chắn xứng đáng với một câu trả lời hoặc 3. – thelatemail
@thelatemail: Cảm ơn bạn đã đề xuất. Tôi đã thêm câu trả lời của mình và đưa vào một ví dụ phức tạp hơn một chút. – Alex