另一种将变量作为因子传递给ggplot2函数

时间:2016-08-12 11:51:56

标签: r function ggplot2

我有一个用于在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"))

1 个答案:

答案 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")