2

複数の変数を持つ積み上げ棒グラフを作成しようとしていますが、次の 2 つの問題で立ち往生しています。

1) 回転した y 軸を取得して、カウントではなくパーセンテージを表示できないようです。

2) 「強く同意する」回答の割合に基づいて変数 (desc) を並べ替えたいと思います。

これが私がこれまでに持っているものの例です:

require(scales)
require(ggplot2)
require(reshape2)

# create data frame
  my.df <- data.frame(replicate(10, sample(1:4, 200, rep=TRUE)))
  my.df$id <- seq(1, 200, by = 1)

# melt
  melted <- melt(my.df, id.vars="id")

# factors
  melted$value <- factor(melted$value, 
                         levels=c(1,2,3,4),
                         labels=c("strongly disagree", 
                                  "disagree", 
                                  "agree", 
                                  "strongly agree"))
# plot
  ggplot(melted) + 
    geom_bar(aes(variable, fill=value, position="fill")) +
    scale_fill_manual(name="Responses",
                      values=c("#EFF3FF", "#BDD7E7", "#6BAED6",
                               "#2171B5"),
                      breaks=c("strongly disagree", 
                               "disagree", 
                               "agree", 
                               "strongly agree"),
                      labels=c("strongly disagree", 
                               "disagree", 
                               "agree", 
                               "strongly agree")) +
    labs(x="Items", y="Percentage (%)", title="my title") +
    coord_flip()

ここまで来ることができたのは、何人かの方々のおかげです。Google が提供した多くのページの一部を次に示します。

http://www.r-bloggers.com/fumblings-with-ranked-likert-scale-data-in-r/

各スタックが合計 100% になるようにスケーリングされたスタック棒グラフを作成します

sessionInfo()
R version 2.15.0 (2012-03-30)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] reshape2_1.2.2  ggplot2_0.9.2.1 scales_0.2.2   

loaded via a namespace (and not attached):
 [1] colorspace_1.2-0    dichromat_1.2-4     digest_0.6.0        grid_2.15.0         gtable_0.1.1        HH_2.3-23          
 [7] labeling_0.1        lattice_0.20-10     latticeExtra_0.6-24 MASS_7.3-22         memoise_0.1         munsell_0.4        
[13] plyr_1.7.1          proto_0.3-9.2       RColorBrewer_1.0-5  rstudio_0.97.237    stringr_0.6.1       tools_2.15.0       
4

2 に答える 2

4

リッカート データを扱っているためlikert()、パッケージ HH の関数を検討することをお勧めします。(元の ggplot2 アプローチに対処する適切な回答が既にあることを考えると、別の方向に向けても問題ないことを願っています。)

期待likert()どおり、最小限の苦労でリッカートに適した方法でプロットします。PositiveOrder=TRUEアイテムが正の方向にどれだけ伸びているかによってアイテムを並べ替えます。このReferenceZero引数を使用すると、ニュートラル アイテムの中央をゼロ中心にすることができます (以下では必要ありませんが、ここに示されています)。カウントをパーセントに変換し、as.percent=TRUE余白に実際のカウントをリストします (オフにしない限り)。

library(reshape2)
library(HH)

# create data as before
my.df <- data.frame(replicate(10, sample(1:4, 200, rep=TRUE)))
my.df$id <- seq(1, 200, by = 1)

# melt() and dcast() with reshape2 package
melted <- melt(my.df,id.var="id", na.rm=TRUE)
summd <- dcast(data=melted,variable~value, length) # note: length()
                                                   # not robust if NAs present

# give names to cols and rows for likert() to use
names(summd) <- c("Question", "strongly disagree", 
                              "disagree", 
                              "agree", 
                              "strongly agree")
rownames(summd) <- summd[,1]  # question number as rowname
summd[,1] <- NULL             

# plot
likert(summd,
       as.percent=TRUE,       # automatically scales
       main = NULL,           # or give "title",
       xlab = "Percent",      # label axis
       positive.order = TRUE, # orders by furthest right
       ReferenceZero = 2.5,   # zero point btwn levels 2&3
       ylab = "Question",     # label for left side
       auto.key = list(space = "right", columns = 1,
                     reverse = TRUE)) # make positive items on top of legend

ここに画像の説明を入力

于 2012-12-28T03:19:43.387 に答える
3

(1)
パーセンテージを取得するには、data.framefromを作成する必要がありますmelted。少なくともそれは私が考えることができた方法です。

# 200 is the total sum always. Using that to get the percentage
require(plyr)
df <- ddply(melted, .(variable, value), function(x) length(x$value)/200 * 100)

次に、計算されたパーセンテージを次のようweightsに指定します。geom_bar

ggplot(df) + 
geom_bar(aes(variable, fill=value, weight=V1, position="fill")) +
scale_fill_manual(name="Responses",
                  values=c("#EFF3FF", "#BDD7E7", "#6BAED6",
                           "#2171B5"),
                  breaks=c("strongly disagree", 
                           "disagree", 
                           "agree", 
                           "strongly agree"),
                  labels=c("strongly disagree", 
                           "disagree", 
                           "agree", 
                           "strongly agree")) +
labs(x="Items", y="Percentage (%)", title="my title") +
coord_flip()

よくわかりません(2)。(a) 計算relative percentagesしますか (「強く同意する」と参照して) または (b) プロットに常に「強く同意する」、次に「同意する」などを表示しますか? df の並べ替え係数

df$value <- factor(df$value, levels=c("strongly agree", "agree", "disagree", 
                 "strongly disagree"), ordered = TRUE)

Edit:次のように、レベルを必要な順序に並べ替えることができvariableますvalue

variable.order <- names(sort(daply(df, .(variable), 
                     function(x) x$V1[x$value == "strongly agree"] ), 
                     decreasing = TRUE))
value.order <- c("strongly agree", "agree", "disagree", "strongly disagree")
df$variable <- factor(df$variable, levels = variable.order, ordered = TRUE)
df$value <- factor(df$value, levels = value.order, ordered = TRUE)
于 2012-12-28T01:49:11.657 に答える