0

R に ~7000 行のデータフレームがあります。私のデータフレームの10行が表示されます-

TypeA   TypeB   Ct_for_typeA    Ct_for_typeB
code3   code2   m               n
code4   code1   m               p
code3   code7   p               n
code8   code6   n               n
code1   code3   m               p
code5   code8   n               o
code2   code1   o               p
code5   code5   p               m
code7   code4   o               m
code6   code1   m               o

列 1 (TypeA) と列 2 (TypeB) には、code1 から code8 までの 8 つの異なるコードがあります。列 3 と列 4 には、m、n、o、p の 4 つの異なるカテゴリがあります。x軸にcode1からcode8、y軸に「パーセンテージ」の棒グラフをプロットしたいと思います。x 軸には 8 組のバーがあり、y 軸にはコードのパーセンテージが表示され、さらに列 3 (列 1 の場合) と列 4 (列 2 の場合) に従って各バーを異なる色のスタックで分割したいことを意味します。 . 例:

x 軸のコードの最初のペア、つまり code1 のみを考慮します。上記の 10 行から、「TypeA」の code1 が 10%、「TypeB」の code1 が 30% であることがわかります。したがって、最初のペアには 10% までの最初のバーと 30% までの 2 番目のバーがあります。これで、最初のペアの最初のバーが 3 番目の列に従って分割されます (積み上げられた色)。コード 1 には "m" しかないことがわかるように、色は "m" (全体の 10%) になりますが、"TypeB" のコード 1 の場合、つまり、最初のペアの 2 番目のバーは色 "p" で 20% に分割されます。色「o」で10%。

「beside=F」で色を重ねてみましたが、うまくいきました。つまり、1 列目と 3 列目だけあれば簡単にできるということです。しかし、2 番目と 4 番目の列に 2 番目のバーを含めると、混乱します。私の説明が混乱しないことを願っています。前もって感謝します。

編集:トーマスによるコメントの後。

「my_frame」が 10 行を超えるデータフレームの場合。私が使用した積み重ねられた色を持つ単一の変数の場合-

px=ggplot(my_frame,aes(x=TypeA,fill=Ct_for_typeA))+geom_bar()
print(px)

まず第一に、ここでは y 軸のパーセンテージを取得していません。次に、2 列目にあり、積み上げられた色が 4 列目にあるバーを「横に」配置するにはどうすればよいですか。

4

1 に答える 1

0

現在、ワイド フォーマットのデータを表示しました。これは、各変数が 1 つの列であることを意味します。ggplot はむしろ長いフォーマットが好きです。

データフレームでカウントするには、data.tableパッケージを使用できます。あなたの名前またはコードは同じように呼ばれているためmelt、reshape2 パッケージの関数を簡単に使用することはできません。したがって、経由で迂回しdata.tableます。

library(data.table)
test.df <- read.table("your.data", header=T, sep='\t')

# create a data table
test.dt <- as.data.table(test.df)

# here it would be possible to use melt, if your "codes" wouldn't be named identical

# count TypeA
 test.a.count.dt <- test.dt[, length(Ct_for_typeA), by="TypeA" ]
 test.a.count.dt
    TypeA V1
1: code1  1
2: code2  1
3: code3  2
4: code4  1
5: code5  2
6: code6  1
7: code7  1
8: code8  1

# do the same for TypeB
test.b.count.dt <- test.dt[, length(Ct_for_typeB), by="TypeB" ]

colnames(test.a.count.dt) <- c("code","count")
colnames(test.b.count.dt) <- c("code","count")

test.a.count.dt$type <- "TypeA"
test.b.count.dt$type <- "TypeB"


# fuse the two data sets
# this is a long data format that suits ggplot better
test.all.count.dt <- rbind(test.a.count.dt, test.b.count.dt)

colnames(test.all.count.dt) <- c("code","count","type")

# this can be plotted already, but it isn't relative
ggplot(data=test.all.count.dt, aes(code, count, fill=type)) + geom_bar(stat="identity", position="dodge")

# the detour to get relative counts
test.all.count.dt$relative <- apply(test.all.count.dt, 1, function(x){
 count<-x[2];
 type<-x[3];
 return(as.numeric(count)/sum(test.all.count.dt$type==type))
})

# finally plot your relative counts
ggplot(data=test.all.count.dt, aes(code, relative, fill=type)) +
  geom_bar(stat="identity", position="dodge")

ggplot にはgeom_bar既にstat=countメソッドがありますが、これは絶対データのみをプロットします。geom_bar相対値を直接返す方法が見つかりませんでした。

于 2016-03-14T17:43:57.623 に答える