【问题标题】:Adding labels to pie chart in R... Radiating "spokes"?在 R 中向饼图添加标签...辐射“辐条”?
【发布时间】:2015-06-18 17:01:53
【问题描述】:

有没有办法(使用 ggplot 或其他包)在 R 中调整饼图标签的角度?例如,这段代码(使用 R 默认值):

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

创建这个饼图:

我想要的是这样的饼图(我在 PhotoShop 中非常粗略地创建了它):

【问题讨论】:

    标签: r charts ggplot2 pie-chart


    【解决方案1】:

    正如@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 函数,您将得到下图:

    【讨论】:

      【解决方案2】:

      只需在调用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], ...)
        

      现在你调用新函数:

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

      【讨论】:

        猜你喜欢
        • 2017-01-02
        • 2021-11-30
        • 2019-07-16
        • 2018-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多