如何在ggplot2中动态设置主题对象?

时间:2014-10-29 09:39:26

标签: r ggplot2

我正在尝试定义此函数以轻松地将自定义主题设置为ggplot,但我无法动态使用element_blank()等函数。例如,指定是否具有垂直网格线作为TRUE / FALSE参数:

qplot(data=df, x=quarter, y=value, geom="line") + 
  style(grid.vertical = F)


style = function (grid.vertical = T) {
(theme_foundation() + 
 theme(
       panel.grid.major.x = ifelse(grid.vertical == T, element_line(), element_blank())
 ))}

产生..

Error in (function (el, elname)  : 
Element panel.grid.major.x must be a element_line object.

有没有办法让这项工作?

2 个答案:

答案 0 :(得分:1)

似乎错误是由ifelse if产生的。我从那里接受的答案尝试了解决方法,但这没有帮助。所以我想最简单的方法是切换到常规style.if = function (grid.vertical = T) { t <- theme() if (grid.vertical) t <- t + theme(panel.grid.major.x = element_line(colour = 'red')) else t <- t + theme(panel.grid.major.x = element_blank()) t } ggplot(mtcars, aes(x=wt, y=mpg)) + geom_line() + style.if() ggplot(mtcars, aes(x=wt, y=mpg)) + geom_line() + style.if(F) ,虽然代码似乎不是特别整洁。

{{1}}

答案 1 :(得分:1)

这与ggplot代码检查类型的方式有关:

...
else if (!inherits(el, eldef$class) && !inherits(el, "element_blank")) {
    stop("Element ", elname, " must be a ", eldef$class, 
        " object.")
}

由于我们正在使用ifelse函数,我认为这种动态类型检查voodoo会将ifelse视为此处的“元素”,因此条件永远不会满足,因为它不会从element_blank继承。要解决这个问题,只需使用常规的if / else表达式而不是ifelse:

style = function (grid.vertical = T) {
(theme_foundation() + 
 theme(
       panel.grid.major.x = if(grid.vertical == T) element_line() else element_blank()
 ))}

我遇到了完全相同的问题,这个解决方案对我有用。