在R中向饼图添加标签...辐射"辐条"?

时间:2015-06-17 07:35:09

标签: r charts ggplot2 pie-chart

是否有办法(使用ggplot或其他一些软件包)来对R中饼图的标签进行角度调整?例如,此代码(使用R默认值):

data <- c(4,9,2,5)
names <- c("alpha","beta","gamma","delta")
pie(data,names)

创建此饼图: enter image description here

我想要的是这样的饼图(我在PhotoShop中非常粗略地创建): enter image description here

2 个答案:

答案 0 :(得分:5)

正如@agstudy指出的那样,您需要修改函数体以创建自己的pie函数。实际上,pie不会返回任何值,因此您不知道确切地放置标签的位置和角度。

首先,您可以使用pie

获取graphics::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)
}

然后,您可以在srt调用中指定参数text,将角度设置为度数,根据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函数,您将获得以下图表: enter image description here

答案 1 :(得分:1)

在调用pie之前添加:

par(srt=45) 

这将旋转图中的任何文字。

或更好:

pie(data,names,srt=45)

给出不同的旋转角度:

如果要设置许多旋转角度,则需要破解pie功能:

  1. 添加srt参数
  2. 替换行:

     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], ...)
    
  3. 现在你调用新函数:

    pie(data,names,srt=c(45,50,45,-12))
    

    enter image description here