r语言ggplot函数
Tidyverse包(例如ggplot2和dplyr)具有通常很方便的函数语法:您不必将列名放在引号中。 例如:
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()
类的其他东西。)如果您一直关注,请随时过滤其他城市。
library(dplyr)
library(ggplot2)
# File name I want to download data to:
myfilename <- "Zillow_neighborhood_home_values.csv"
# If go.infoworld.com/ZillowData doesn't work, full URL is
# http://files.zillowstatic.com/research/public/Neighborhood/Neighborhood_Zhvi_Summary_AllHomes.csv
download.file("https://go.infoworld.com/ZillowData", myfilename)
bos_values <- rio::import("Zillow_neighborhood_home_values.csv") %>%
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 Home Value Index by Boston Neighborhood") +
theme_classic() +
theme(plot.title=element_text(size=24)) +
coord_flip()
如果我想使用自己的函数来快速生成带有任何数据框的图形,该怎么办? 更具体地说,具有数据框名称,x列,y列和图形标题的输入参数的函数吗?
下面是一种尝试使用我想要的自定义方法创建名为mybarplot
的函数,而不使用rlang包的尝试。 但是,它将不起作用。
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 Home Value Index by Boston Neighborhood")
结果是我收到一个错误,如您在上面的视频中看到的。 如果我 调用带引号的列名的函数,我得到一个图—但不是我想要的图。
这是由于基R的问题需要带引号的列名,而ggplot则不需要。
较早版本的rlang软件包为此提供了一个多步骤解决方案,正如我在前面的“用R做更多”,“ R中的Tidy Eval”中介绍的那样 。 当前版本的rlang通过一个称为整洁的评估运算符的新运算符-双花括号来解决该问题。 您只需将花括号放在函数内未加引号的列名周围,就可以完成!
请注意,您至少需要rlang软件包的0.4.0版本才能运行。 在我撰写本文时,版本0.4.0在CRAN上,但是在安装过程中(至少在Mac上)给定该选项,则需要从源代码进行编译。
在下面的代码中,我加载了rlang并调整了我的条形图函数,因此每次在ggplot中引用列名时,都会用双花括号将其括起来-包创建者将其称为“ curly curl”。
library(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 Home Value Index by Boston Neighborhood")
就像tidyverse函数一样,我不需要将列名放在引号中。 它创建如下图
我仍然可以使用其他ggplot命令来调整由函数创建的图形。 在下一段代码中,我将自定义函数创建的图形保存到变量中,然后进行一些更改。 geom_text()
代码在每个条形图上显示中间值,而theme()
设置图形标题尺寸。
mygraph <- mybarplot(bos_values, RegionName, Zhvi,
"Zillow Home Value Index by Boston Neighborhood")
mygraph +
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的更多技巧,请访问InfoWorld上的“用R做更多 ”页面或YouTube上的“用R做更多”播放列表 。
翻译自: https://www.infoworld.com/article/3410295/how-to-write-your-own-ggplot2-functions-in-r.html
r语言ggplot函数