13

ggplot2を使用して、回避位置を使用して、横軸に係数を、塗りつぶし色に別の係数を使用してヒストグラムを作成しています。私の問題は、フィルファクターが水平ファクターの値に対して1つの値しかとらないことがあり、バーをかわすものが何もないと全幅を占めることです。すべてのバーの幅が同じになるように何も回避しないようにする方法はありますか?または同等に0をプロットしますか?

例えば

ggplot(data = mtcars, aes(x = factor(carb), fill = factor(gear))) +
geom_histogram(position = "dodge")

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

この答えにはいくつかのアイデアがあります。新しいバージョンがリリースされる前にも尋ねられたので、何かが変わったのでしょうか?ファセットの使用(ここにも表示されています)データの編集と使用は機能すると思いますが、自分の状況は気に入らないのですが、geom_barエレガントではありません。また、とにかく琢刻してみたら

ggplot(mtcars, aes(x = factor(carb), fill = factor(gear))) +
    geom_bar() + facet_grid(~factor(carb))

「layout_base(data、cols、drop = drop)のエラー:少なくとも1つのレイヤーにファセットに使用されるすべての変数が含まれている必要があります」というエラーが表示されます

カウントのデータフレームを生成してから、を使用できると思いますgeom_bar

mtcounts <- ddply(subset(mtcars, select = c("carb", "gear")),
    .fun = count, .variables = c("carb", "gear"))

存在しないレベルに0を入力します。それがうまくいくかどうか、またはより良い方法があるかどうか誰かが知っていますか?

4

2 に答える 2

12

更新された geom_barニーズstat = "identity"

手遅れかどうかはわかりませんが、最近の投稿への回答はこちらをご覧ください。 つまり、Joranのアドバイスに従って、ggplot通話外のカウントを事前に計算し、を使用しますgeom_bar。他の投稿への回答と同様に、カウントは2つのステップで取得されます。最初に、カウントのクロス集計はdcast;を使用して取得されます。次にmelt、クロス集計。

library(ggplot2)
library(reshape2)

dat = dcast(mtcars, factor(carb) ~ factor(gear), fun.aggregate = length)
dat.melt = melt(dat, id.vars = "factor(carb)", measure.vars = c("3", "4", "5"))
dat.melt

(p <- ggplot(dat.melt, aes(x = `factor(carb)`, y = value, fill = variable)) + 
  geom_bar(stat = "identity", position = "dodge"))

チャート:

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

于 2012-04-28T01:34:41.687 に答える
0

この回答に示されているように、(バージョン> = 2.2.1.900)の新しいバージョンでggplot2は、より簡単な方法があります。に設定すると常に回避するという引数をposition_dodge取得します。preserve"single"

ggplot(data = mtcars, aes(x = factor(carb), fill = factor(gear))) +
  geom_bar(position = position_dodge(preserve = "single"))

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

于 2019-02-13T14:25:19.453 に答える