20

私はかなりの時間を理解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=valaes()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

正しい

4

1 に答える 1

24

問題は、グループの値の範囲内でスタックし、の値のnumをかわしたいということだと思います。バーにアウトラインを追加するとどうなるかを確認すると役立つ場合があります。num

library(ggplot2)
set.seed(123)
df <- data.frame(
  id     = 1:18,
  names  = rep(LETTERS[1:3], 6),
  num    = c(rep(1, 15), rep(2, 3)),
  values = sample(1:10, 18, replace=TRUE)
)

デフォルトでは、多くのバーが積み重ねられています。アウトラインがない限り、バーが分離していることはわかりません。

# Stacked bars
ggplot(df, aes(x=factor(names), y=values, fill=factor(num))) + 
  geom_bar(stat="identity", colour="black")

積み上げ棒

かわすと、の値の間でかわされるバーが表示されますが、 :numの各値内に複数のバーが存在する場合があります。num

# Dodged on 'num', but some overplotted bars
ggplot(df, aes(x=factor(names), y=values, fill=factor(num))) + 
  geom_bar(stat="identity", colour="black", position="dodge", alpha=0.1)

numをかわす

グループ化変数としても追加するidと、それらすべてが回避されます。

# Dodging with unique 'id' as the grouping var
ggplot(df, aes(x=factor(names), y=values, fill=factor(num), group=factor(id))) + 
  geom_bar(stat="identity", colour="black", position="dodge", alpha=0.1)

すべてのバーをかわす

回避とスタックの両方が必要だと思いますが、両方を行うことはできません。したがって、最良のことは、データを自分で要約することです。

library(plyr)
df2 <- ddply(df, c("names", "num"), summarise, values = sum(values))

ggplot(df2, aes(x=factor(names), y=values, fill=factor(num))) + 
  geom_bar(stat="identity", colour="black", position="dodge")

事前に要約

于 2012-07-23T21:24:31.203 に答える