私はかなりの時間を理解geom_bar()
していて、position="dodge"
。2つのグループを示す棒グラフを作成しようとしていました。元々、データは2つの別々のデータフレームからのものでした。この質問に従って、私は自分のデータを長い形式で入れました。私の例:
test <- data.frame(names=rep(c("A","B","C"), 5), values=1:15)
test2 <- data.frame(names=c("A","B","C"), values=5:7)
df <- data.frame(names=c(paste(test$names), paste(test2$names)), num=c(rep(1,
nrow(test)), rep(2, nrow(test2))), values=c(test$values, test2$values))
支出と予算の例に似ているので、この例を使用します。支出には要素レベルごとに多くの行がありnames
ますが、予算には1つしかありません(カテゴリごとに1つの予算額)。
積み上げ棒グラフの場合、これはうまく機能します。
ggplot(df, aes(x=factor(names), y=values, fill=factor(num))) +
geom_bar(stat="identity")
特に、y値の最大値に注意してください。これらは、のデータと上の青色で示されtest
ている値の合計です。test2
私が読んだ他の質問に基づいて、私はposition="dodge"
それを並べたプロットと積み重ねられたプロットにするために追加する必要があります:
ggplot(df, aes(x=factor(names), y=values, fill=factor(num))) +
geom_bar(stat="identity", position="dodge")
見た目は素晴らしいですが、新しい最大y値に注意してください。y値の各名前の因子レベルから最大y値を取得しているようtest
です。もはやそれらを合計していません。
他のいくつかの質問(これとこれのように、私もgroup=
成功せずにオプションを追加しようとしました(上記と同じ回避されたプロットを生成します):
ggplot(df, aes(x=factor(names), y=values, fill=factor(num), group=factor(num))) +
geom_bar(stat="identity", position="dodge")
スタックがうまく機能し、回避されたものが単に上にではなく並べて配置されない理由がわかりません。
ETA: ggplot googleグループでこれに関する最近の質問を見つけましたalpha=0.5
。何が起こっているのかを確認するために、追加する提案があります。ggplotが各グループから最大値を取得しているわけではありません。実際には、値ごとにバーを重ねてプロットしすぎています。
を使用する場合position="dodge"
、ggplotはxごとに1つのyのみを期待しているようです。これについて、ggplot開発者であるWinston Changに連絡して、利点が見当たらないため、これを変更できるかどうかを確認および問い合わせました。
y値を渡さない場合と渡さない場合に発生する個々のカウントではなく、渡された内部stat="identity"
を集計するようにggplotに指示する必要があるようです。y=val
aes()
stat="identity"
今のところ、回避策は(上記の元のdfの場合)集約するように思われるため、xごとにyは1つだけです。
df2 <- aggregate(df$values, by=list(df$names, df$num), FUN=sum)
p <- ggplot(df2, aes(x=Group.1, y=x, fill=factor(Group.2)))
p <- p + geom_bar(stat="identity", position="dodge")
p