web-dev-qa-db-ja.com

ggplotのグループ化された棒グラフ

行が観察と列の質問である調査ファイルがあります。

以下にいくつかの 偽データ を示します:

People,Food,Music,People
P1,Very Bad,Bad,Good
P2,Good,Good,Very Bad
P3,Good,Bad,Good
P4,Good,Very Bad,Very Good
P5,Bad,Good,Very Good
P6,Bad,Good,Very Good

私の目的は、ggplot2でこの種のプロットを作成することです。

  • 私は絶対に色、デザインなどを気にしません
  • プロットは偽のデータに対応していません

enter image description here

ここに私の偽のデータがあります:

raw <- read.csv("http://Pastebin.com/raw.php?i=L8cEKcxS",sep=",")
raw[,2]<-factor(raw[,2],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)
raw[,3]<-factor(raw[,3],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)
raw[,4]<-factor(raw[,4],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)

しかし、カウントとしてYを選択すると、Xとグループの値の選択に関する問題に直面しています... reshape2を使用せずに成功できるかどうかわかりません...メルト機能付きの形状変更を使用します。しかし、私はそれを使用する方法を理解していません...

43
S12000

最初に、各カテゴリのカウント、つまり各グループ(食品、音楽、人物)のバッドとグッズの数などを取得する必要があります。これは次のように行われます。

raw <- read.csv("http://Pastebin.com/raw.php?i=L8cEKcxS",sep=",")
raw[,2]<-factor(raw[,2],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)
raw[,3]<-factor(raw[,3],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)
raw[,4]<-factor(raw[,4],levels=c("Very Bad","Bad","Good","Very Good"),ordered=FALSE)

raw=raw[,c(2,3,4)] # getting rid of the "people" variable as I see no use for it

freq=table(col(raw), as.matrix(raw)) # get the counts of each factor level

次に、データフレームを作成し、それを溶かしてプロットする必要があります。

Names=c("Food","Music","People")     # create list of names
data=data.frame(cbind(freq),Names)   # combine them into a data frame
data=data[,c(5,3,1,2,4)]             # sort columns

# melt the data frame for plotting
data.m <- melt(data, id.vars='Names')

# plot everything
ggplot(data.m, aes(Names, value)) +   
  geom_bar(aes(fill = variable), position = "dodge", stat="identity")

これはあなたが望んでいることですか?

enter image description here

少し明確にするために、 ggplot multiple grouping bar では、次のようなデータフレームがありました。

> head(df)
  ID Type Annee X1PCE X2PCE X3PCE X4PCE X5PCE X6PCE
1  1    A  1980   450   338   154    36    13     9
2  2    A  2000   288   407   212    54    16    23
3  3    A  2020   196   434   246    68    19    36
4  4    B  1980   111   326   441    90    21    11
5  5    B  2000    63   298   443   133    42    21
6  6    B  2020    36   257   462   162    55    30

列4〜9に数値があり、後でy軸にプロットされるため、これはreshapeで簡単に変換してプロットできます。

現在のデータセットには、同様のものが必要だったため、freq=table(col(raw), as.matrix(raw))を使用してこれを取得しました。

> data
   Names Very.Bad Bad Good Very.Good
1   Food        7   6    5         2
2  Music        5   5    7         3
3 People        6   3    7         4

Very.BadX1PCEX2PCEの代わりにX3PCEBadGoodなどがあると想像してください。類似性を参照してください?しかし、最初にそのような構造をcreateする必要がありました。したがって、freq=table(col(raw), as.matrix(raw))

81
jakub