Cara menulis fungsi ggplot2 anda sendiri di R

Pakej tidyverse seperti ggplot2 dan dplyr mempunyai sintaks fungsi yang biasanya cukup berguna: Anda tidak perlu meletakkan nama lajur dalam tanda petik. Sebagai contoh: 

dplyr :: filter (mtcars, mpg> 30)

Perhatikan nama lajur, mpg, tidak disebut harga.

Ciri itu tidak berguna, jika anda ingin menulis fungsi R anda sendiri menggunakan tidyverse. Ini kerana fungsi asas R biasanya memerlukan nama lajur yang dikutip sedangkan fungsi tidyverse umumnya tidak.

Tetapi masalah itu mempunyai penyelesaian yang mudah sekarang, terima kasih kepada versi terbaru pakej rlang. Dan bahawa cara ia sangat mudah untuk mewujudkan fungsi ggplot anda sendiri untuk graf disesuaikan kegemaran anda.

Mari saya teliti satu contoh, menggunakan data dari Zillow dengan anggaran nilai rumah rata-rata. Dalam kod di bawah, saya memuatkan beberapa paket, menetapkan nama fail data saya, dan menggunakan download.filefungsi base R untuk memuat turun CSV dari Zillow. Data Final prep langkah: Import yang CSV ke dalam R dan penapis untuk baris di mana Cityadalah Boston. (Saya menggunakan pakej rio untuk pengimportan data kerana saya suka rio, tetapi anda boleh menggunakan sesuatu yang lain seperti read_csv()atau fread().) Sekiranya anda mengikuti, jangan ragu untuk menapis bandar lain.

perpustakaan (dplyr)

perpustakaan (ggplot2)

# Nama fail Saya ingin memuat turun data ke:

myfilename <- "Zillow_neighborhood_home_values.csv"

# Jika go.infoworld.com/ZillowData tidak berfungsi, URL penuh adalah

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

muat turun.file ("// go.infoworld.com/ZillowData", nama myfilen)

nilai_bos%

penapis (Bandar == "Boston")

Seterusnya, saya akan membuat carta palang mendatar dengan beberapa penyesuaian yang sering saya gemari. Saya memesan bar dari nilai tertinggi hingga terendah, menguraikannya dengan warna hitam, mewarnainya dengan warna biru, dan menukar latar belakang kelabu lalai ggplot2.

ggplot (data = bos_values, aes (x = susun semula (RegionName, Zhvi), y = Zhvi)) +

geom_col (warna = "hitam", isi = "# 0072B2") +

xlab ("") +

ylab ("") +

ggtitle ("Indeks Nilai Rumah Zillow oleh Kejiranan Boston") +

tema_kelas () +

tema (plot.title = element_text (saiz = 24)) +

co_flip ()

Bagaimana jika saya ingin membuat fungsi saya sendiri untuk menghasilkan grafik seperti ini dengan cepat dengan kerangka data apa pun? Lebih khusus lagi, fungsi dengan argumen input nama bingkai data, lajur x, lajur y, dan tajuk grafik? 

Di bawah ini adalah satu percubaan untuk membuat fungsi yang disebut mybarplotdengan penyesuaian yang saya mahukan, tanpa menggunakan paket rlang. Namun, ia tidak akan berjaya.

mybarplot <- fungsi (mydf, myxcol, myycol, mytitle) {

ggplot (data = mydf, aes (x = susun semula (myxcol, myycol), y = myycol)) +

geom_col (warna = "hitam", isi = "# 0072B2") +

xlab ("") +

ylab ("") +

coord_flip () +

ggtitle (mytitle) +

tema_kelas () +

tema (plot.title = element_text (saiz = 24))

}

Saya akan menunjukkan kepada anda apa yang berlaku sekiranya saya cuba memanggil fungsi tersebut menggunakan nama lajur yang tidak disebut harga. Contohnya: 

mybarplot (bos_values, RegionName, Zhvi,

"Indeks Nilai Rumah Zillow oleh Kejiranan Boston")

Hasilnya adalah saya mendapat ralat, seperti yang anda lihat dalam video di atas. Sekiranya saya  memanggil fungsi dengan nama lajur yang dipetik, saya mendapat grafik - tetapi bukan grafik yang saya mahukan.

Sharon Machlis,

Ini disebabkan oleh isu asas R yang memerlukan nama lajur yang dikutip sementara ggplot tidak.

Versi lama dari paket rlang mempunyai penyelesaian pelbagai langkah untuk ini, seperti yang saya bahas dalam episod sebelumnya "Do More With R," "Tidy Eval in R." Yang semasa versi menyelesaikan rlang masalah dengan pengendali baru yang dikenali sebagai operator penilaian kemas - pendakap kerinting double. Anda hanya meletakkan pendakap keriting di sekitar nama lajur yang tidak disebut harga di dalam fungsi anda, dan anda sudah selesai!

Perhatikan bahawa anda memerlukan sekurang-kurangnya versi 0.4.0 dari pakej rlang agar ini berfungsi. Pada masa saya menulis artikel ini, versi 0.4.0 ada di CRAN tetapi anda perlu menyusunnya dari sumber ketika diberi pilihan tersebut semasa pemasangan, paling tidak pada Mac.

Dalam kod di bawah ini, saya memuat rlang dan mengubah fungsi plot bar saya sehingga setiap kali saya merujuk pada nama lajur dalam ggplot, saya mengepungnya dengan pendakap keriting berganda - "keriting keriting" adalah bagaimana pembuat pakej merujuk kepadanya. 

perpustakaan (rlang)

mybarplot <- fungsi (mydf, myxcol, myycol, mytitle) {

ggplot2 :: ggplot (data = mydf, aes (x = susun semula ({{myxcol}},

{{myycol}}), y = {{myycol}})) +

geom_col (warna = "hitam", isi = "# 0072B2") +

xlab ("") +

ylab ("") +

coord_flip () +

ggtitle (mytitle) +

tema_kelas () +

tema (plot.title = element_text (saiz = 24))

}

Sekarang saya boleh memanggil fungsi saya dengan

mybarplot (bos_values, RegionName, Zhvi,

"Indeks Nilai Rumah Zillow oleh Kejiranan Boston")

Sama seperti fungsi tidyverse, saya tidak perlu meletakkan nama lajur dalam tanda petik. Ini membuat graf seperti yang ada di bawah

Sharon Machlis,

Saya masih dapat mengubah grafik yang dibuat oleh fungsi saya, menggunakan perintah ggplot yang lain. Pada blok kod seterusnya, saya menyimpan grafik yang dibuat oleh fungsi tersuai saya ke pemboleh ubah dan kemudian membuat beberapa perubahan lagi. The geom_text()kod memaparkan nilai median ke setiap bar, dan theme()set saiz Graf tajuk.

mygraph <- mybarplot (bos_values, RegionName, Zhvi,

"Indeks Nilai Rumah Zillow oleh Kejiranan Boston")

mygraph +

geom_text (aes (label = skala :: koma (Zhvi, awalan = "$")),

hjust = 1.0, warna = "putih", kedudukan = posisi_dodge (.9), ukuran = 4) +

tema (plot.title = element_text (saiz = 24))

Grafik baru akan kelihatan seperti ini:

Sharon Machlis,

Untuk lebih banyak petua R, buka halaman "Lakukan Lebih Banyak Dengan R" di atau senarai main "Lakukan Lebih Banyak Dengan R" di YouTube.