web-dev-qa-db-ja.com

ggplot棒グラフから未使用の因子レベルを削除

この質問 の反対と この質問 の反対のことをしたいのですが、それはプロットそのものではなく、凡例についてです。

他のSOの質問は、未使用の因子レベルをkeepする方法について尋ねているようです。多数の棒グラフを作成するために使用している変数属性のいくつかの列(ワイド形式)。再現可能な例を次に示します。

_library(ggplot2)
df <- data.frame(name=c("A","B","C"), var1=c(1,NA,2),var2=c(3,4,5))
ggplot(df, aes(x=name,y=var1)) + geom_bar()
_

私はこれを得る:

enter image description here

対応する変数を持つ名前のみが欲しいnが棒グラフに表示されます(たとえば、Bには空のスペースはありません)。

出力ファイル名と_y=var_ビットを簡単に変更できれば、ベースプロットコードの再利用は非常に簡単です。可能であれば、各プロットの結果にドロップレベルを使用するためだけに、データフレームをサブセット化する必要はありません。


na.omit()提案に基づいた更新

改訂されたデータセットを検討してください。

_library(ggplot2)
df <- data.frame(name=c("A","B","C"), var1=c(1,NA,2),var2=c(3,4,5), var3=c(NA,6,7))
ggplot(df, aes(x=name,y=var1)) + geom_bar()
_

NAが存在するため、_var1_のプロットにna.omit()を使用する必要があります。ただし、na.omitはall列に値が存在することを確認するため、_var3_にNAがあるため、プロットはAも削除します。これは私のデータにより類似しています。私は約15のNAを回答しました。 currentプロットされたyベクトルの値を持たず、anyにNAを持たない因子レベルのみを削除したいデータフレーム全体のベクトル。

19
Hendy

1つの簡単なオプションは、データフレームdfna.omit()を使用して、NAでそれらの行を削除することです。

_ggplot(na.omit(df), aes(x=name,y=var1)) + geom_bar()
_

あなたの更新を考えると、次の

_ggplot(df[!is.na(df$var1), ], aes(x=name,y=var1)) + geom_bar()
_

正常に機能し、_Var1_のNAのみを考慮します。 nameVarのみをプロットしている場合、それらの変数のみを含むデータフレームにna.omit()を適用します

_ggplot(na.omit(df[, c("name", "var1")]), aes(x=name,y=var1)) + geom_bar()
_
20
Gavin Simpson

プロットするときは、データフレームの2列のみを使用していることに注意してください。つまり、data.frame全体を渡すのではなく、関連する列x[,c("name", "var1")] apply na.omitを使用して不要な列を削除できます。行(Gavin Simpsonが示唆するように)na.omit(x[,c("name", "var1")])してから、このデータをプロットします。

私のR/ggplotは非常に錆びており、おそらくこれを達成するためのよりクリーンな方法があることを認識しています。

5
Tilo Wiklund