在 R 中向饼图添加标签...辐射 "spokes"?
Adding labels to pie chart in R... Radiating "spokes"?
有没有办法(可能使用 ggplot 或其他一些包)在 R 中调整饼图标签的角度?例如,此代码(使用 R 默认值):
data <- c(4,9,2,5)
names <- c("alpha","beta","gamma","delta")
pie(data,names)
创建此饼图:
我想要的是这样的饼图(我在PhotoShop中制作的很粗略):
在调用 pie
之前添加:
par(srt=45)
这将旋转图中的任何文本。
或更好:
pie(data,names,srt=45)
给出不同的旋转角度:
如果要设置多个旋转角度,需要破解pie
函数:
- 添加一个
srt
参数
替换行:
text(1.1 * P$x, 1.1 * P$y, labels[i], xpd = TRUE,
adj = ifelse(P$x < 0, 1, 0),col='blue', ...)
来自
text(1.1 * P$x, 1.1 * P$y, labels[i], xpd = TRUE,
adj = ifelse(P$x < 0, 1, 0),col='blue',srt=srt[i], ...)
现在调用新函数:
pie(data,names,srt=c(45,50,45,-12))
正如@agstudy 指出的那样,您需要修改函数体以创建您自己的 pie
函数。实际上,pie
没有 return 任何值,因此您不知道标签的确切放置位置和角度。
首先,您可以使用 graphics::pie
获取 pie
的正文
在函数结束时,饼图绘制为:
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
函数,您将得到以下图表:
有没有办法(可能使用 ggplot 或其他一些包)在 R 中调整饼图标签的角度?例如,此代码(使用 R 默认值):
data <- c(4,9,2,5)
names <- c("alpha","beta","gamma","delta")
pie(data,names)
创建此饼图:
我想要的是这样的饼图(我在PhotoShop中制作的很粗略):
在调用 pie
之前添加:
par(srt=45)
这将旋转图中的任何文本。
或更好:
pie(data,names,srt=45)
给出不同的旋转角度:
如果要设置多个旋转角度,需要破解pie
函数:
- 添加一个
srt
参数 替换行:
text(1.1 * P$x, 1.1 * P$y, labels[i], xpd = TRUE, adj = ifelse(P$x < 0, 1, 0),col='blue', ...)
来自
text(1.1 * P$x, 1.1 * P$y, labels[i], xpd = TRUE, adj = ifelse(P$x < 0, 1, 0),col='blue',srt=srt[i], ...)
现在调用新函数:
pie(data,names,srt=c(45,50,45,-12))
正如@agstudy 指出的那样,您需要修改函数体以创建您自己的 pie
函数。实际上,pie
没有 return 任何值,因此您不知道标签的确切放置位置和角度。
首先,您可以使用 graphics::pie
pie
的正文
在函数结束时,饼图绘制为:
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:
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
函数,您将得到以下图表: