我有一个用于在R-markdown中构建条形图的功能。我想知道是否有更好的方法来做我的ggplot2函数的aes部分。目前我使用“eval(解析(text =”但有点难以阅读/理解。
我想要一些更直接/可读的东西。我尝试了aes_string,但我认为“fill = factor()”部分没有用,因为当我得到一个图表时,我得到了一个错误的(我有一个大的,肥胖的吧)。我错了吗?或者这是我做图表的最佳方式。
可重复的例子:
library("data.table")
library("ggplot2")
dt <- data.table(year.var = c(2014, 2014, 2014, 2015, 2015, 2015),
grp.var = c("Grp1", "Grp2", "Grp3", "Grp1", "Grp2", "Grp3"),
val.var = c(100, 200, 230, 105, 260, 23))
test <- function (dts,
x.var,
y.var,
fill.var,
order.var) {
setorderv(dts, order.var)
ggplot(dts,
aes(x = eval(parse(text = x.var)),
y = eval(parse(text = y.var)),
fill = eval(parse(text = fill.var))
)
) +
geom_bar(stat="identity", position="dodge")+
scale_fill_manual(values = c("#9badcd", "#5a6c9c"),
name = "Year")+
scale_y_continuous(labels = function(val.var) {
format(val.var, big.mark = " ",
scientific = FALSE)
}
)+
xlab("x.label") +
ylab("y.label")+
ggtitle("str.title")
}
test(dt, "grp.var", "val.var", "factor(year.var)", c("year.var"))
答案 0 :(得分:1)
我认为解决方案是尽量保持aes
中的映射简单,并直接在data.table
中进行数据操作。在这里,我在data.table
中创建了一个新列,它是填充所需列的因子。然后可以使用aes_string
test <- function (dts,
x.var,
y.var,
fill.var,
order.var) {
dts <- dts[, f.var := as.factor(dts[, get(fill.var)])]
#NB this will modify your original table
setorderv(dts, order.var)
ggplot(dts,
aes_string(x = x.var, y = y.var, fill = "f.var")) +
geom_bar(stat="identity", position="dodge")+
scale_fill_manual(values = c("#9badcd", "#5a6c9c"), name = "Year")+
scale_y_continuous(labels = function(val.var) {
format(val.var, big.mark = " ", scientific = FALSE)
})+
labs(x = "x.label", y = "y.label", title = "str.title")
}
test(dt, "grp.var", "val.var", "year.var", "year.var")