gpt4 book ai didi

R:使用 ggplot2 以百分比作为标签的饼图

转载 作者:行者123 更新时间:2023-12-04 03:00:49 29 4
gpt4 key购买 nike

从数据框中,我想绘制五个类别的饼图,它们的百分比作为同一图中的标签,从高到低,顺时针方向。

我的代码是:

League<-c("A","B","A","C","D","E","A","E","D","A","D")
data<-data.frame(League) # I have more variables

p<-ggplot(data,aes(x="",fill=League))
p<-p+geom_bar(width=1)
p<-p+coord_polar(theta="y")
p<-p+geom_text(data,aes(y=cumsum(sort(table(data)))-0.5*sort(table(data)),label=paste(as.character(round(sort(table(data))/sum(table(data)),2)),rep("%",5),sep="")))
p

我用
cumsum(sort(table(data)))-0.5*sort(table(data))

将标签放在相应的部分并
label=paste(as.character(round(sort(table(data))/sum(table(data)),2)),rep("%",5),sep="")

对于标签,这是百分比。

我得到以下输出:
Error: ggplot2 doesn't know how to deal with data of class uneval

最佳答案

我保留了你的大部分代码。我发现这很容易通过省略 coord_polar 来调试。 ...更容易以条形图的形式查看正在发生的事情。

主要的事情是将因子从高到低重新排序以使绘图顺序正确,然后只需使用标签位置即可使它们正确。我还简化了您的标签代码(您不需要 as.characterrep ,而 paste0sep = "" 的快捷方式。)

League<-c("A","B","A","C","D","E","A","E","D","A","D")
data<-data.frame(League) # I have more variables

data$League <- reorder(data$League, X = data$League, FUN = function(x) -length(x))

at <- nrow(data) - as.numeric(cumsum(sort(table(data)))-0.5*sort(table(data)))

label=paste0(round(sort(table(data))/sum(table(data)),2) * 100,"%")

p <- ggplot(data,aes(x="", fill = League,fill=League)) +
geom_bar(width = 1) +
coord_polar(theta="y") +
annotate(geom = "text", y = at, x = 1, label = label)
p
at计算是找到楔形的中心。 (更容易将它们视为堆积条形图中条形的中心,只需运行上面的图形而不带 coord_polar 线即可查看。) at计算可以分解如下:
table(data)是每组的行数, sort(table(data))将它们按绘制顺序排列。服用 cumsum()当我们彼此堆叠时,它为我们提供了每个条形的边缘,乘以 0.5 为我们提供了堆叠中每个条形高度的一半(或饼的楔形宽度的一半)。
as.numeric()只是确保我们有一个数字向量而不是类 table 的对象.

从累积高度中减去半宽得出堆叠时每个条的中心。但是 ggplot 会将最大的条形堆叠在底部,而我们所有的 sort() ing 把最小的放在最前面,所以我们需要做 nrow -一切都是因为我们实际计算的是相对于条形顶部的标签位置,而不是底部。 (而且,对于原始分解数据, nrow() 是总行数,因此是条形的总高度。)

关于R:使用 ggplot2 以百分比作为标签的饼图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26392818/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com