正如@agstudy 指出的那样,您需要修改函数体以创建自己的pie 函数。事实上,pie 不会返回任何值,因此您不知道将标签准确放置在何处以及以哪个角度放置。
首先,你可以用graphics::pie获取pie的body
在函数的最后,用 :
绘制饼图
for (i in 1L:nx) {
n <- max(2, floor(edges * dx[i]))
P <- t2xy(seq.int(x[i], x[i + 1], length.out = n))
polygon(c(P$x, 0), c(P$y, 0), density = density[i], angle = angle[i],
border = border[i], col = col[i], lty = lty[i])
P <- t2xy(mean(x[i + 0:1]))
lab <- as.character(labels[i])
if (!is.na(lab) && nzchar(lab)) {
lines(c(1, 1.05) * P$x, c(1, 1.05) * P$y)
text(1.1 * P$x, 1.1 * P$y, labels[i], xpd = TRUE,
adj = ifelse(P$x < 0, 1, 0), ...)
}
}
您感兴趣的部分是text 之后的部分,您可以在其中指定旋转它们的角度(就像@agstudy 所做的那样)。为了使用正确的角度,你必须计算它(这是我的答案与另一个不同的部分......)。
实际上,它在绘图之前就已经计算好了:
t2xy <- function(t) {
t2p <- twopi * t + init.angle * pi/180
list(x = radius * cos(t2p), y = radius * sin(t2p))
}
你只需要让这个函数也输出角度:
t2xy <- function(t) {
t2p <- twopi * t + init.angle * pi/180
list(x = radius * cos(t2p), y = radius * sin(t2p), an=t2p)
}
然后,您可以在text调用中指定参数srt,以度为单位,根据x有2个选项:
text(1.1 * P$x, 1.1 * P$y, labels[i], xpd = TRUE,
srt = ifelse(P$x < 0, P$an/pi*180+180, P$an/pi*180),
adj = ifelse(P$x < 0, 1, 0), ...)
使用您的数据,调用修改后的pie 函数,您将得到下图: