7

これが私の単純化されたデータです:

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())

棒グラフでは、パーセンテージを週ごと、ランクごとにラベル付けしたいと思います。問題は、データにランクのパーセンテージがないという事実です。そして、このデータの構造は、1 つを持つのに適していません。(もちろん、元のデータには例よりもはるかに多くの観測値があります)

このグラフのパーセンテージにラベルを付ける方法を教えてくれる人はいますか?

4

1 に答える 1

18

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範囲内で指定されたの相対頻度が含まれています (したがって、他の 2 つよりも 2 倍豊富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))

これはあなたが望んでいたものですか?

ここに画像の説明を入力

于 2013-08-24T17:41:48.083 に答える