1. ホーム
  2. r

[解決済み] ggplot2 geom_bar 位置の不具合

2022-02-07 19:29:20

質問

を使用しています。 ..count.. の変換は geom_bar という警告が表示されます。 position_stack は x 間隔が重ならないようにする必要があります。 カテゴリにカウントが少ないものがある場合。

これは、いくつかのモックデータ(私のデータは方向と風速を含むので、それに関連する名前を保持しています)を使って説明するのが最も良い方法です。

#make data
set.seed(12345)
FF=rweibull(100,1.7,1)*20  #mock speeds
FF[FF>60]=59
dir=sample.int(10,size=100,replace=TRUE) # mock directions

#group into speed classes
FFcut=cut(FF,breaks=seq(0,60,by=20),ordered_result=TRUE,right=FALSE,drop=FALSE)

# stuff into data frame & plot
df=data.frame(dir=dir,grp=FFcut)
ggplot(data=df,aes(x=dir,y=(..count..)/sum(..count..),fill=grp)) + geom_bar()

これは問題なく動作し、結果としてプロットは速度によってグループ化された方向の頻度を示しています。カウント数が最も少ない速度クラス(ここでは "[40,60]")が5カウントになることは関連性があります。

しかし、より多くのベロシティクラスは、警告につながる。たとえば

FFcut=cut(FF,breaks=seq(0,60,by=15),ordered_result=TRUE,right=FALSE,drop=FALSE)
 

最も少ないカウント数の速度クラス (現在は "[45,60]") は3カウントしかなく、ggplot2 は次のように警告を出します。

position_stack は x の間隔が重ならないようにする必要があります。

で、プロットはこのカテゴリのデータがx軸に沿って広がって表示されます。 これが正しく動作するためには、グループの最小サイズが5であることが必要なようです。

の機能なのかバグなのか、教えていただければと思います。 stat_bin (どの geom_bar を使用しているのか)、あるいは単に geom_bar .

また、これを回避する方法があれば教えてください。

敬具

解決方法

この現象は df$dir は数値なので、ggplotオブジェクトは連続したX軸を仮定し、美的パラメータである group は、唯一の既知の離散変数 ( fill = grp ).

その結果、単純に数が少ない場合は dir の値は grp = [45,60) この場合、ggplotは各棒の幅がどの程度であるべきかで混乱します。これは、プロットを異なるファセットに分割すると、より視覚的に明白になります。

ggplot(data=df,
            aes(x=dir,y=(..count..)/sum(..count..),
                fill = grp)) + 
  geom_bar() + 
  facet_wrap(~ grp)

> for(l in levels(df$grp)) print(sort(unique(df$dir[df$grp == l])))
[1]  1  2  3  4  6  7  8  9 10
[1]  1  2  3  4  5  6  7  8  9 10
[1]  2  3  4  5  7  9 10
[1] 2 4 7

また、手動で、ソートされた df$dir の値は1であり、最初の3つの grp の値は2ですが、最後の1つは2です。そのため、デフォルトのバー幅は広くなっています。

以下の解決策は、すべて同じ結果を得ることができるはずです。

1. すべてのグループに対して同じバー幅を明示的に geom_bar() :

ggplot(data=df,
       aes(x=dir,y=(..count..)/sum(..count..),
           fill = grp)) + 
  geom_bar(width = 0.9)

2. 変換する dir に渡す前に、カテゴリ変数に変換します。 aes(x = ...) :

ggplot(data=df,
       aes(x=factor(dir), y=(..count..)/sum(..count..),
           fill = grp)) + 
  geom_bar()

3. を指定する。 group パラメータは df$dir &です。 df$grp :

ggplot(data=df,
       aes(x=dir,
           y=(..count..)/sum(..count..),
           group = interaction(dir, grp),
           fill = grp)) + 
  geom_bar()