4

次のような「積み上げ」棒グラフで個々の「ブロック」にラベルを付ける簡単な方法はありますか。ラベルを各ブロックの上部近くに配置したいのですが、私の最新のアプローチでは、以下のように、米国とメキシコのテキストをなんとか交換することになります。

棒グラフの例

解決策を探しているyと、テキストの値を外部で事前に計算する必要があるアプローチしか見つかりませんでした。これは、余分なロジックは別として、ブロックがスタックされる順序を制御するという問題をもたらします...また、このスタックオーバーフローの質問
を見つけました。ここで、を使用することを思いつきました (以下のコードを参照) 。これは、現在のアプローチを説明するために切り詰められたコードスニペットです。私は必ずしもこのスニペットを修正しようとしているわけではありません。スタック棒グラフ領域にラベルを付けるための一般的なイディオムならどれでもかまいません。 編集:(この質問がこれまでに得た2つの答えを考慮して)私はむしろ事前計算を意味しない解決策を望んで いることを強調したいと思いますgeom="text"stat_bin


テキストのy位置

# sample data source
df.StackData <- data.frame(
    QType = c("A4-1", "A4-1", "A4-1",  "B3", "B3", "B3"),
    Country = c("Canada", "USA", "Mexico", "Canada", "USA", "Mexico"),
    NbOfCases = c(1000, 1320, 380, 400, 1000, 812),
    AvgRate = c(17.2, 11.4, 44.21, 17.3, 15.3, 39.7),
    Comment = c("Can", "US", "Mex", "Can", "US", "Mex")
)

およびggplotの呼び出し。ラベルの奇妙な交換を使用して、上記のグラフを生成します(また、追加の凡例もありますが、この凡例の問題は簡単に処理できます。この質問の準備中に注意しました)。

ggplot(data=df.StackData,
       aes(x=QType, y=NbOfCases, fill=Country))+
  geom_bar(stat="identity", width=1) +
  stat_bin(geom="text", aes(label=paste("R coef =",
                                        formatC(AvgRate, format="f", digits=3),
                                        "(", Comment, ")" ),
                            vjust=1.5, size=3 
                        )
  )

私の最初の試みでは、次のようにgeom_text()をグラフに追加しましたが、もちろんyの値は間違っていました(個々のブロックの下部ではなく、グラフの下部を基準にしてテキストを配置します)...

  ... +
  geom_text(mapping=aes(x=QType, y=NbOfCases, 
                        label=paste("R coef =",
                                    formatC(AvgRate, format="f", digits=3),
                                    "(", Comment, ")" ),
                         vjust=1.5),
            size=3)
4

4 に答える 4

2

これが解決策です

df2 = ddply(df.StackData, .(QType), transform, 
 pos = cumsum(NbOfCases) - 0.5 * NbOfCases)

ggplot(data = df2, aes(x = QType, y = NbOfCases, fill = Country)) +
  geom_bar(stat = "identity") +
  geom_text(aes(y = pos, label = paste("R coef =", 
   formatC(AvgRate, format="f", digits=3), "(", Comment, ")" ))
  )

Imgur

于 2013-03-14T20:56:41.953 に答える
2

これが解決策です。ここには2つのことがあります。まず、データreorderのレベルとdata.frame同じ順序にする必要がありますdf.StackData。次に、データの累積合計をdata.frame計算して計算する別のデータを作成します。y-position

# reorder levels of factor to the same order as found in data
df.StackData$Country <- factor(df.StackData$Country, 
          levels=c("Canada", "USA", "Mexico"), ordered=TRUE)
p <- ggplot(data=df.StackData, aes(x=QType, fill=Country))
p <- p + geom_bar(aes(weights=NbOfCases))

# compute corresponding y-axis positions by cumulative sum
require(plyr)
df <- ddply(df.StackData, .(QType), function(x) {
    x$NbOfCases <- cumsum(x$NbOfCases)
    x
})

# then use geom_text with data = df (the newly created data)
p + geom_text(data = df,  aes(x=QType, y=NbOfCases, 
        label=paste("R coef =", 
        formatC(AvgRate, format="f", digits=3), 
        "(", Comment, ")" ), vjust=1.5), size=3)

ここに画像の説明を入力してください

編集:自分でy-posを計算したくない場合は、を使用する必要がありますstat_bin。列のレベルを並べ替えるだけCountryで機能します。

# data
df.StackData <- data.frame(
    QType = c("A4-1", "A4-1", "A4-1",  "B3", "B3", "B3"),
    Country = c("Canada", "USA", "Mexico", "Canada", "USA", "Mexico"),
    NbOfCases = c(1000, 1320, 380, 400, 1000, 812),
    AvgRate = c(17.2, 11.4, 44.21, 17.3, 15.3, 39.7),
    Comment = c("Can", "US", "Mex", "Can", "US", "Mex")
)

# just add this: reorder the level 
df.StackData$Country <- factor(df.StackData$Country, 
          levels=c("Canada", "USA", "Mexico"), ordered=TRUE)

# your code again using stat_bin (just changed the width to 0.75)
ggplot(data=df.StackData,
       aes(x=QType, y=NbOfCases, fill=Country))+
  geom_bar(stat="identity", width=.75) +
  stat_bin(geom="text", size=4, aes(label=paste("R coef =",
                                        formatC(AvgRate, format="f", digits=3),
                                        "(", Comment, ")" ),
                            vjust=1.5))

ここに画像の説明を入力してください

于 2013-03-14T20:50:53.580 に答える
1

余分な凡例を削除するには、 を使用できますshow_guide=FALSE。あなたの例では:

ggplot(data=df.StackData,
       aes(x=QType, y=NbOfCases, fill=Country))+
  geom_bar(stat="identity", width=.75) +
  stat_bin(geom="text", size=4, aes(label=paste("R coef =",
                                        formatC(AvgRate, format="f", digits=3),
                                        "(", Comment, ")" ),
                            vjust=1.5), show_guide=FALSE)
于 2013-05-22T21:22:46.437 に答える
1

別の方法があります。デフォルトでは、ファクターはアルファベット順に並べ替えられるため、データフレームの順序に合わせてファクターを並べ替えるのではなく、これに合わせてデータフレームを並べ替えることをお勧めします。私の考えでは、これにより、より一般的な解決策が可能になります。望ましくない凡例を取得していた唯一の理由は、内部にサイズがあったためですaes。以下で修正しました。

データの使用:

df.StackData <- with(df.StackData, df.StackData[order(Country),])

その後、元のソリューションを で使用できますstat_bin。動作するかどうかを確認するためだけに、もう少し複雑なデータセットでテストしました。

df.StackData <- data.frame(
  QType = rep(c("A4-1","B3"), each = 6),
  Country = rep(c("Canada", "USA", "Mexico", "UK", "Sweden", "Australia"), times = 2),
  NbOfCases = c(1000, 1320, 380, 400, 1000, 812, 542, 531, 674, 328, 795, 721),
  AvgRate = c(17.2, 11.4, 44.21, 17.3, 15.3, 39.7, 21.1, 25.3, 24.1, 31.3, 38.4, 36.1),
  Comment = rep(c("Can", "US", "Mex", "UK", "Aus", "Swe"), times = 2)
)

並べ替えなし:

ggplot(data=df.StackData,
       aes(x=QType, y=NbOfCases, fill=Country))+
  geom_bar(stat="identity", width=1) +
  stat_bin(geom="text", aes(label=paste("R coef =", formatC(AvgRate, format="f", digits=3),
"(", Comment, ")" ),  vjust = 1),size=3)
geom_text(aes(label = Comment), stat="identity")

ここに画像の説明を入力

並べ替え後:

df.StackData <- with(df.StackData, df.StackData[注文(国),])

ここに画像の説明を入力

于 2013-03-14T23:46:00.460 に答える