r语言ggplot函数_如何在R中编写自己的ggplot2函数

r语言ggplot函数

Tidyverse包(例如ggplot2和dplyr)具有通常很方便的函数语法:您不必将列名放在引号中。 例如:

dplyr::filter(mtcars, mpg > 30)

请注意,列名mpg未引用。

但是,如果要使用tidyverse编写自己的R函数,则该功能并不是很方便。 这是因为基本R函数通常需要带引号的列名,而tidyverse函数通常不需要。

[ 在我们的视频教程系列中获得Sharon Machlis的R技巧 | 阅读InfoWorld教程: 学习使用R处理大数据 如何重塑R中的数据 触手可及的R数据操作技巧R的 初学者指南 | 通过InfoWorld大数据报告新闻通讯了解最新的分析和大数据。 ]

但是,由于有了最新版本的rlang软件包 ,该问题现在有了一个简单的解决方案。 意味着为自己喜欢的自定义图形创建自己的ggplot函数非常容易。

让我举一个例子,使用来自Zillow的数据和估计的中位数房屋价值。 在下面的代码中,我加载了几个程序包,设置了数据文件名,并使用基R的download.file函数从Zillow下载CSV。 最终的数据准备步骤:将CSV导入R并过滤CityBoston行。 (我使用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")

结果是我收到一个错误,如您在上面的视频中看到的。 如果我   调用带引号的列名的函数,我得到一个图—但不是我想要的图。

所有条形相同高度的图形 沙龙·马克斯(IDG)

尝试创建自定义ggplot2函数时,这不是我想要的图形。

这是由于基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函数一样,我不需要将列名放在引号中。 它创建如下图

波士顿邻里的房屋中位价图 沙龙·马克斯(IDG)

使用自定义ggplot2函数创建的波士顿附近地区房屋中位价图表。 来自Zillow的数据。

我仍然可以使用其他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))

新图将如下所示:

波士顿附近房屋价值中位数的图表,在条形图上显示。 沙龙·马克斯(IDG)

由自定义ggplot函数创建的图形,然后通过函数外部的ggplot代码进行调整。 来自Zillow的数据。

有关R的更多技巧,请访问InfoWorld上“用R做更多 ”页面YouTube上“用R做更多”播放列表

翻译自: https://www.infoworld.com/article/3410295/how-to-write-your-own-ggplot2-functions-in-r.html

r语言ggplot函数

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值