在饼图中放置标签

6
使用R中的pie函数时,标签会出现在饼图之外。是否有一种方法可以将标签放置在每个饼图切片内部?
f=table(LETTERS[c(rep(1,7),rep(2,10),rep(3,5))])
pie(f)

这里展示了如何使用ggplotplace-labels-on-pie-chart中实现。但是,pie函数有没有实现的方法呢?

编辑:针对一些评论关于使用饼图的问题,我想详细说明一下我的意图。实际上,我只是将饼图作为散点矩阵的一部分来可视化回归的整个数据框架。该矩阵设置如下:

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

看到了吗,我需要在对角线上使用一些因子,并决定使用饼图。我决定不添加标签,并删除所有轴标签。我使用较深的颜色表示更大的饼片…所以也许这可能是一种不好的显示信息的方式,但我认为它非常适合因子变量,比条形图更好地显示了观测值在因子水平上的比例分布。下面的图描述了lars包中的糖尿病数据集。

diabetes data set

1个回答

5
我认为没有简单的方法来完成这个任务,因为标签位置是硬编码的-请查看

末尾。
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)

这似乎需要大量工作,但你需要做更多的工作来调整或格式化文本。

(可能会发现有争论要做到这一点)


1
不错的解决方法。我敢打赌更改饼图一定很难,因为统计学中没有人应该使用饼图。;-) - Rich Scriven
谢谢Richard,是的,我本来要引用?pie帮助文件的——“饼图是一种非常糟糕的信息展示方式”。 - user20650
专业提示:您可以在函数上使用“tail”,即“tail(pie, 9)”等同于您可能需要滚动查看的“body”调用。当然,您仍然需要“body<-”来更改函数体。 - Rich Scriven
@RichardScriven;感谢您的指引-这确实更加简洁。但是,对于覆盖代码,不幸的是,从“body”中提取的行并不是单独的行(body(pie)[22])-是否有更好的方法来解决这个问题?因为上述方法看起来非常笨拙。 - user20650
是的,请尝试使用 as.list(body(pie))。但是,对于 pie 来说,rapply 可能不太适合。 - Rich Scriven
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接