[解決済み] ggplot2 geom_bar 位置の不具合
質問
を使用しています。
..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()
関連
-
[解決済み] ggplot2 の軸ラベルを回転させ、間隔を空ける
-
[解決済み] ggplot2 Rプロットで軸の制限を設定するには?
-
[解決済み] ggplot2 の棒グラフで棒を並べる
-
[解決済み] ggplot2 を使って 2 つの変数を同じグラフに線でプロットする
-
[解決済み】ggplot2によるサイド・バイ・サイド・プロット
-
[解決済み】ggplot2でプロットタイトルを中央に配置する
-
[解決済み】ggplot2で軸の文字の大きさや向きを変更したい
-
[解決済み】ggplot2 のデフォルトのカラーパレットをエミュレートする
-
[解決済み] ggplot2 でマージナルヒストグラムを用いた散布図
-
[解決済み] geom_bar ggplot2 の棒グラフを値で並べ替える
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Stataバージョン5-12の.dtaファイルではない
-
[解決済み】ggplotの線幅を変更するには?
-
[解決済み】R - if文の引数の長さが0である。
-
[解決済み】データのマージ - fix.by(by.x, x)のエラー)
-
[解決済み】R Markdown - html出力でフォントサイズとフォントタイプを変更する
-
[解決済み】ロジスティック回帰 - eval(family$initialize) : y 値は 0 <= y <= 1 である必要があります。
-
[解決済み】R 置換する項目数が置換長の倍数でない/しかし結果は正しい
-
[解決済み】ggplot2でのプロット:「Error: カテゴリ軸のY軸に "Discrete value supplied to continuous scale "と表示される。
-
[解決済み】 .subset2(x, i, exact = exact)のエラー:Rの添え字が範囲外である。
-
[解決済み】.External.graphics Rでエラーが発生しました。