【问题标题】:R - put labels inside pie chartR - 在饼图中放置标签
【发布时间】:2014-09-16 23:44:04
【问题描述】:

使用 R 中的 pie 函数,标签出现在饼图之外。有没有办法在饼图的每个切片中放置标签?

f=table(LETTERS[c(rep(1,7),rep(2,10),rep(3,5))])
pie(f)

它展示了如何使用ggplot 执行此操作,此处为place-labels-on-pie-chart。有没有办法用pie函数做到这一点?

编辑:为了回应一些关于使用饼图的 cmets,我想详细说明我的意图。我实际上只是使用饼图作为散点图矩阵的一部分来可视化整个数据框以进行回归。矩阵设置如下:

  • 下面板
    背景颜色较深的样本相关性数字表示绝对相关性较高。
  • 上面板
    • 数字散点图
    • 数值的箱线图(按因子)
  • 对角面板
    • 数值的正态密度直方图
    • 因子饼图

看,我需要一些关于对角线的因素,并决定使用饼图。无论如何,我决定将标签留在外面,并取下所有轴标签。我宁愿为更大的饼片使用较深的颜色......所以也许它可能是显示信息的一种不好的方式,但我认为它对于因子变量很有效,显示观察结果如何在因子水平上比条形图更好地成比例。下图描述了lars包中的糖尿病数据集。

【问题讨论】:

    标签: r pie-chart


    【解决方案1】:

    我认为没有一种简单的方法可以做到这一点,因为标签位置是硬编码的 - 看看结尾

    body(pie)
    
            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), ...)
            }
        }
        title(main = main, ...)
        invisible(NULL)
    }
    

    但是你可以覆盖程序的这一部分

    # create a new pie function to save overwriting original
    newpie <- pie
    
    # Tweak the label positions - changed 1.1 to 0.7
    # also commented out the lines function - so that the  
    # small lines next to the labels are not plot
    newlbs <- quote(if (!is.na(lab) && nzchar(lab)) {
                       #lines(c(1, 1.05) * P$x, c(1, 1.05) * P$y)
                        text(0.7 * P$x, 0.7 * P$y, labels[i], xpd = TRUE, 
                                         adj = ifelse(P$x < 0, 1, 0), ...)
    })
    
    # add in the new lines of code - trial and error found the right position
    body(newpie)[[22]][[4]][[7]] <- newlbs
    
    newpie(f)
    

    所以看起来工作量很小,但它已经到了那里,你需要做更多的工作来调整文本的角度或格式。

    (可能证明有这样做的理由)

    【讨论】:

    • 不错的解决方法。我敢打赌,更改饼图非常困难,因为统计中的任何人都不应该使用饼图。 ;-)
    • 干杯理查德,是的,我要引用 ?pie 帮助 - Pie charts are a very bad way of displaying information
    • 专业提示:您可以在函数上使用tail,即tail(pie, 9) 等效于您可能必须滚动浏览的body 调用。当然,换body还是需要body&lt;-
    • @RichardScriven;感谢您的指点 - 这当然更整洁。为了覆盖代码,不幸的是,body 中的行不是单行 (body(pie)[22]) - 有没有更好的方法来做到这一点,因为上面看起来非常笨拙?
    • 我从未见过@987654331 的替代品@我就是这样做的,我还没有看到更好的方法
    猜你喜欢
    • 2013-08-27
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多