问题描述
我目前正在尝试在 R 中订购条形图。该图是在一个函数中创建的,使用传递的变量来选择列。这是基本功能:
plotting <- function(column_to_use) {
ggplot(iris,aes(x = Sepal.Length,))+
aes_string(y = column_to_use)+
geom_col()
}
plotting("Species")
这会产生正确的情节,但我仍然必须订购它。我已经尝试过 base-R 重新排序和 forcats fct_reorder()。代码差异以粗体显示。
# reorder
plotting <- function(column_to_use) {
ggplot(iris,))+
aes_string(y = reorder(iris[column_to_use],Sepal.Width))+
geom_col()
}
plotting("Species")
> Error in tapply(X = X,INDEX = x,FUN = FUN,...) :
object 'Sepal.Width' not found
我正在使用 aes_string 使用非标准评估和数字转换变量列名,这在重新排序时不起作用。遗憾的是,没有可用的 reorder_ 对应物。
# fct_reorder
plotting <- function(column_to_use) {
iris %>%
fct_reorder(iris[column_to_use],Sepal.Width) %>%
ggplot( aes(x = Sepal.Length))+
aes_string(y = column_to_use)+
geom_col()
}
plotting("Species")
> Error: `f` must be a factor (or character vector).
有什么更好的选择可以让 Sepal.Width 对条形进行排序?
解决方法
aes_string
已被软弃用。尝试使用 .data
:
library(ggplot2)
plotting <- function(column_to_use) {
ggplot(iris,aes(x = Sepal.Length,y = reorder(.data[[column_to_use]],Sepal.Width)))+
geom_col()
}
plotting("Species")
,
我们可以转换为 sym
bol 并使用 !!
进行评估。它可以接受带引号和不带引号的输入
library(ggplot2)
plotting <- function(column_to_use) {
ggplot(iris,y = reorder(!! ensym(column_to_use),Sepal.Width)))+
geom_col()
}
plotting("Species")
plotting(Species)