Rで独自のggplot2関数を作成する方法

ggplot2やdplyrのようなTidyverseパッケージには、通常は非常に便利な関数構文があります。列名を引用符で囲む必要はありません。例えば: 

dplyr :: filter(mtcars、mpg> 30)

列名mpgは引用符で囲まれていないことに注意してください。

ただし、tidyverseを使用して独自のR関数を作成する場合は、この機能は便利ではありません。これは、ベースR関数には通常、引用符で囲まれた列名が必要ですが、tidyverse関数には通常必要ないためです。

しかし、最新バージョンのrlangパッケージのおかげで、この問題の解決策は簡単になりました。そしてことを意味、それはあなたの好みにカスタマイズグラフの独自のggplot関数を作成することは非常に簡単です。

Zillowのデータと推定中央値の住宅価格を使用して、例を見てみましょう。以下のコードでは、いくつかのパッケージをロードし、データファイル名を設定し、ベースRのdownload.file関数を使用してZillowからCSVをダウンロードします。最終的なデータ準備手順:そのCSVをRにインポートし、Cityがである行をフィルタリングしますBoston。(私はrioが大好きなので、データのインポートにrioパッケージを使用していますが、read_csv()またはのような他のものを使用できますfread()。)フォローしている場合は、別の都市を自由にフィルタリングしてください。

ライブラリ(dplyr)

ライブラリ(ggplot2)

#データをダウンロードしたいファイル名:

myfilename <-"Zillow_neighborhood_home_values.csv"

#go.infoworld.com / ZillowDataが機能しない場合、完全なURLは

#// files.zillowstatic.com/research/public/Neighborhood/Neighborhood_Zhvi_Summary_AllHomes.csv

download.file( "// go.infoworld.com/ZillowData"、myfilename)

bos_values%

filter(City == "Boston")

次に、よく使用するカスタマイズを使用して横棒グラフを作成します。バーを最高値から最低値の順に並べ、黒で輪郭を描き、青で色付けし、ggplot2のデフォルトの灰色の背景を変更しています。

ggplot(data = bos_values、aes(x = reorder(RegionName、Zhvi)、y = Zhvi))+

geom_col(color = "black"、fill = "#0072B2")+

xlab( "")+

ylab( "")+

ggtitle( "ボストン近隣によるZillow住宅価値指数")+

theme_classic()+

theme(plot.title = element_text(size = 24))+

coord_flip()

任意のデータフレームでこのようなグラフをすばやく生成する独自の関数を作成したい場合はどうすればよいですか?具体的には、データフレーム名、x列、y列、グラフタイトルの入力引数を持つ関数? 

以下はmybarplot、rlangパッケージを使用せずに、必要なカスタマイズで呼び出される関数を作成する1つの試みです。ただし、機能しません。

mybarplot <-function(mydf、myxcol、myycol、mytitle){

ggplot(data = mydf、aes(x = reorder(myxcol、myycol)、y = myycol))+

geom_col(color = "black"、fill = "#0072B2")+

xlab( "")+

ylab( "")+

coord_flip()+

ggtitle(mytitle)+

theme_classic()+

theme(plot.title = element_text(size = 24))

}

引用符で囲まれていない列名を使用してその関数を呼び出そうとするとどうなるかを示します。例えば: 

mybarplot(bos_values、RegionName、Zhvi、

「ボストン近隣によるZillow住宅価値指数」)

その結果、上のビデオでわかるように、エラーが発生します。 引用符で囲まれた列名を使用して関数を呼び出すと、グラフが表示されますが、必要なグラフは表示されません。

シャロン・マクリス、

これは、ベースRが引用符で囲まれた列名を必要とするのに対し、ggplotは必要としないという問題が原因です。

以前のエピソード「DoMoreWith R」、「Tidy Eval in R」で説明したように、古いバージョンのrlangパッケージにはこれに対する複数のステップのソリューションがありました。rlangの現在のバージョンは、整頓された評価演算子と呼ばれる新しい演算子(二重中括弧)で問題を解決します。関数内の引用符で囲まれていない列名を中括弧で囲むだけで、完了です。

これを機能させるには、少なくともバージョン0.4.0のrlangパッケージが必要であることに注意してください。私がこの記事を書いた時点では、バージョン0.4.0はCRANにありましたが、少なくともMacでは、インストール中にそのオプションが与えられたときにソースからコンパイルする必要がありました。

以下のコードでは、rlangをロードし、棒グラフ関数を微調整しているため、ggplot内で列名を参照するたびに、二重中括弧で囲みます。「curly curly」は、パッケージ作成者が参照する方法です。 

ライブラリ(rlang)

mybarplot <-function(mydf、myxcol、myycol、mytitle){

ggplot2 :: ggplot(data = mydf、aes(x = reorder({{myxcol}}、

{{myycol}})、y = {{myycol}}))+

geom_col(color = "black"、fill = "#0072B2")+

xlab( "")+

ylab( "")+

coord_flip()+

ggtitle(mytitle)+

theme_classic()+

theme(plot.title = element_text(size = 24))

}

これで、関数を呼び出すことができます

mybarplot(bos_values、RegionName、Zhvi、

「ボストン近隣によるZillow住宅価値指数」)

tidyverse関数の場合と同様に、列名を引用符で囲む必要はありませんでした。以下のようなグラフを作成します

シャロン・マクリス、

他のggplotコマンドを使用して、関数によって作成されたグラフを微調整することはできます。次のコードブロックでは、カスタム関数によって作成されたグラフを変数に保存してから、さらにいくつかの変更を加えます。geom_text()コードが各バーの上に中央値を表示し、theme()グラフの見出しのサイズを設定します。

mygraph <-mybarplot(bos_values、RegionName、Zhvi、

「ボストン近隣によるZillow住宅価値指数」)

マイグラフ+

geom_text(aes(label = scales :: comma(Zhvi、prefix = "$"))、

hjust = 1.0、colour = "white"、position = position_dodge(.9)、size = 4)+

theme(plot.title = element_text(size = 24))

新しいグラフは次のようになります。

シャロン・マクリス、

Rのヒントについては、YouTubeの「DoMoreWithR」ページまたは「DoMoreWithR」プレイリストにアクセスしてください。