gpt4 book ai didi

r - 当geom_text不合适时如何在ggplot中放置百分比标签?

转载 作者:行者123 更新时间:2023-12-04 13:16:48 39 4
gpt4 key购买 nike

这是我的简化数据:

company <-c(rep(c(rep("company1",4),rep("company2",4),rep("company3",4)),3))
product<-c(rep(c(rep(c("product1","product2","product3","product4"),3)),3))
week<-c( c(rep("w1",12),rep("w2",12),rep("w3",12)))

mydata<-data.frame(company=company,product=product,week=week)
mydata$rank<-c(rep(c(1,3,2,3,2,1,3,2,3,2,1,1),3))
mydata=mydata[mydata$company=="company1",]

而且,我使用的 R 代码:
ggplot(mydata,aes(x = week,fill = as.factor(rank))) +
geom_bar(position = "fill")+
scale_y_continuous(labels = percent_format())

在条形图中,我想按周、按等级标记百分比。
问题在于数据没有排名百分比。而这个数据的结构并不适合有一个。
(当然,原始数据比示例中的观察值要多得多)

有没有人可以教我如何在此图中标记百分比?

最佳答案

我不确定我明白为什么 geom_text不合适。这是使用它的答案,但如果您指定为什么它不合适,也许有人可能会想出您正在寻找的答案。

library(ggplot2)
library(plyr)

mydata = mydata[,c(3,4)] #drop unnecessary variables
data.m = melt(table(mydata)) #get counts and melt it

#calculate percentage:
m1 = ddply(data.m, .(week), summarize, ratio=value/sum(value))

#order data frame (needed to comply with percentage column):
m2 = data.m[order(data.m$week),]

#combine them:
mydf = data.frame(m2,ratio=m1$ratio)

这为我们提供了以下数据结构。 ratio列包含给定 rank 的相对频率在规定范围内 week (因此可以看到 rank == 3 的数量是其他两个的两倍)。
> mydf
week rank value ratio
1 w1 1 1 0.25
4 w1 2 1 0.25
7 w1 3 2 0.50
2 w2 1 1 0.25
5 w2 2 1 0.25
8 w2 3 2 0.50
3 w3 1 1 0.25
6 w3 2 1 0.25
9 w3 3 2 0.50

接下来,我们必须计算百分比标签的位置并绘制它。
#get positions of percentage labels:
mydf = ddply(mydf, .(week), transform, position = cumsum(value) - 0.5*value)

#make plot
p =
ggplot(mydf,aes(x = week, y = value, fill = as.factor(rank))) +
geom_bar(stat = "identity")

#add percentage labels using positions defined previously
p + geom_text(aes(label = sprintf("%1.2f%%", 100*ratio), y = position))

这是你想要的吗?

enter image description here

关于r - 当geom_text不合适时如何在ggplot中放置百分比标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18332520/

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