13
df <- data.frame (Categories=c("Alpha Category", "Alpha Category", 
                               "Alpha Category", "Bravo Category", 
                               "Bravo Category", "Bravo Category", 
                               "Charlie Category", "Charlie Category", 
                               "Charlie Category"),  
                  choices=c("alpha1", "alpha2", "alpha3", "bravo1", 
                            "bravo2", "bravo3", "charlie1", "charlie2",
                            "charlie3")  , 
                  ratings=c(20,60,40, 55,75,25,65,35,45))    
df.plot <- ggplot(df, aes(Categories, ratings, fill = choices))
           + geom_bar(position="dodge", stat="identity") 
           + coord_flip()    
df.plot <- df.plot 
           + theme_classic(base_size = 16, base_family = "")  
           + scale_fill_brewer(palette="Paired")    
df.plot <- df.plot 
           + scale_y_continuous(breaks=seq(0,100,by=10),limits=c(0,80) )  
           + ylab("Ratings")  
           + theme(axis.text.y = element_text(size=16)) #change font size of y axis label   
df.plot

最も重要なことは、各「カテゴリ」内の「選択肢」を「評価」の降順で表示したいということです。たとえば、ここでは「チャーリー カテゴリ」では charlie1、次に charlie3、次に charlie2 が表示されます。

正直なところ、約1週間オンラインで解決策を探しましたが、見つかりません。私の現在の考えでは、選択肢を要因に変換する必要がありますが、これを適切に行う方法がわかりません。

二次的な重要性として、座標が反転したときに発生するように逆の順序ではなく、上から「アルファ カテゴリ」、「ブラボー カテゴリ」、「チャーリー カテゴリ」の順に「カテゴリ」をリストできれば素晴らしいと思います。

4

2 に答える 2

14
library(ggplot2)
df.plot <- ggplot(df, aes(x=Categories,y=reorder(choices,ratings), fill = choices)) +
  geom_bar(position = "dodge", stat = "identity") + coord_flip() +
  scale_x_discrete(limits = rev(levels(df$Categories)))

ここに画像の説明を入力

于 2013-09-15T19:18:23.557 に答える
6

この回答は、変数とスケールを変換する可能性を利用しませんがggplot(@Metric のクリーンな回答を参照)、変数は事前に変換されます。

各カテゴリ内で、評価に基づいて選択肢を並べ替えます。「choices」が であることを確認してくださいcharacter。それが の場合、入力として要素を並べ替えても、必要な結果が得られないためfactor、 を使用して文字に変換する必要がありますas.character(以下を参照)。

str(df$choices)
# chr [1:9] "alpha1" "alpha2" "alpha3" ...

library(plyr)
df <- ddply(.data = df, .variables = .(Categories), mutate,
            choices = reorder(choices, ratings))

「カテゴリ」の逆レベル

df$Categories <- as.factor(df$Categories)
levels(df$Categories) <- rev(levels(df$Categories))

プロット

df.plot <- ggplot(df, aes(x = Categories, y = ratings, fill = choices)) +
  geom_bar(position = "dodge", stat = "identity") +
  coord_flip() +
  theme_classic(base_size = 16, base_family = "") +
  scale_fill_brewer(palette = "Paired") +
  scale_y_continuous(breaks = seq(0, 100, by = 10), limits = c(0, 80)) +
  ylab("Ratings")  +
  theme(axis.text.y = element_text(size = 16))   

df.plot

ここに画像の説明を入力

@Michael Bellhouse からのコメントに従って編集 - 「アルファ カテゴリはランク付けされているようですが、ブラボーやチャーリーではありません」

'choices' が文字の場合、生成されて並べ替えられる因子レベルは、'choices' のddplyサブセットに基づきます。これはうまくいきます。一方、「選択肢」が元のデータの要因である場合、そのレベルはデータに存在するすべてのレベルに基づいています。次に、ddply「選択」レベルのサブセットで並べ替えが行われますが、並べ替えはレベルの完全なセット内で行われます。これにより、3 つのレベルの競合が発生し、最初のレベルのみが使用されます。

# reorder character version
ll <- dlply(.data = df, .variables = .(Categories), mutate,
            choices.ro = reorder(choices, ratings))

# check levels
lapply(ll, function(x) levels(x$choices.ro))
# $`Alpha Category`
# [1] "alpha1" "alpha3" "alpha2"
# 
# $`Bravo Category`
# [1] "bravo3" "bravo1" "bravo2"
# 
# $`Charlie Category`
# [1] "charlie2" "charlie3" "charlie1"


# choices as factor
df$choices.fac <- as.factor(df$choices)
levels(df$choices.fac)
# [1] "alpha1"   "alpha2"   "alpha3"   "bravo1"   "bravo2"   "bravo3"   "charlie1" "charlie2"
# [9] "charlie3"

# reorder factor version
ll <- dlply(.data = df, .variables = .(Categories), mutate,
            choices.fac.ro = reorder(choices.fac, ratings))

# reordering takes place _within_ each Category, but on the _full set_ of levels
# $`Alpha Category`
# [1] "alpha1"   "alpha3"   "alpha2"   "bravo1"   "bravo2"   "bravo3"   "charlie1" "charlie2"
# [9] "charlie3"
# This set of levels will be used in ggplot if you start with choices as a factor.
# Hence @Michael Bellhouse comment: "alpha category is ranked but not bravo or charlie"

# $`Bravo Category`
# [1] "bravo3"   "bravo1"   "bravo2"   "alpha1"   "alpha2"   "alpha3"   "charlie1" "charlie2"
# [9] "charlie3"
# 
# $`Charlie Category`
# [1] "charlie2" "charlie3" "charlie1" "alpha1"   "alpha2"   "alpha3"   "bravo1"   "bravo2"  
# [9] "bravo3"

# Because a factor only can have one set of levels,
# the first set is used - $`Alpha Category`
# Thus, relordered within category Alpha only.
于 2013-09-15T19:21:02.117 に答える