我想为我所有的情节定义一个通用的风格,我发现定义一个定制的主题非常有用.然而,我也想为不在主题中的变量定义缺省值,例如geom_barplot中的线的大小和条的宽度,或者scale_y_continuous中的expand.

更具体地说,我定义了我的定制主题,以便在柱状图中x轴应该为零,所以我设置了scale_y_continuous(expand=c(0,0)),但每次我调用ggplot时都必须"手动"完成.有没有办法一次性地为所有绘图重新定义这个变量和其他变量的缺省值,就像我可以处理主题中的变量一样?

推荐答案

有几种方法可以做到这一点,尽管要获得像+ mytheme这样简单的语法需要做一些工作,包括创建一个新类来保存主题和zoom 元素,以及覆盖+.gg方法,我个人认为这不值得麻烦:

make_mytheme <- function(scale, theme) {
  structure(list(scale = scale, theme = theme), class = 'mythemeclass')
}

`+.gg` <- function(e1, e2) {
  e2name <- deparse(substitute(e2))
  if(inherits(e2, 'mythemeclass')) {
    e1 <- ggplot2:::add_ggplot(e1, e2$scale, e2name)
    return(ggplot2:::add_ggplot(e1, e2$theme, e2name))
  } else {
    return(ggplot2:::`+.gg`(e1, e2))
  }
}

现在,您可以创建一个可以使用的主题,该主题包含zoom 项目和主题项目:

mytheme <- make_mytheme(scale_y_continuous(expand = c(0, 0)), 
                        theme_bw(base_size = 20))

因此,例如,如果我们有以下图:

p <- ggplot(mtcars, aes(gear, mpg)) + 
  geom_bar(stat = 'summary', fun = mean)

p

enter image description here

我们可以这样做:

p + mytheme

enter image description here

一种更简单的方法是创建一个ggploy本身的包装器:

my_ggplot <- function(...) {
  ggplot(...) + 
  scale_y_continuous(expand = c(0, 0)) +
  theme_bw(base_size = 20)
}

这允许:

my_ggplot(mtcars, aes(gear, mpg)) + 
  geom_bar(stat = 'summary', fun = mean)

enter image description here

可以使用类似的包装器轻松地更改各种几何图形的默认线条粗细,例如:

geom_thickline <- function(...) geom_line(..., size = 2)

或者,再次修改gg添加方法:

thicken_lines <- function(size) {
  structure(list(size = size), class = 'thickener')
}

`+.gg` <- function(e1, e2) {
  if(inherits(e2, 'thickener')) {
    e1$layers <- lapply(e1$layers, function(x) {
      x$aes_params <- c(x$aes_params, size = e2$size)
      x
    })
    return(e1)
  }
  ggplot2:::`+.gg`(e1, e2)
}

这允许:

ggplot(mtcars, aes(gear, mpg)) + 
  geom_line(stat = 'summary', fun = mean) +
  thicken_lines(3)

enter image description here

R相关问答推荐

在R中,如何将变量(A,B和C)拟合在同一列中,如A和B,以及A和C在同一面板中?

在R中使用Scale_y_Break后更改y轴标签

如何使用tryCatch执行语句并忽略警告?

从一个列表的框架中移除列表包装器

如何指定我的函数应该查找哪个引用表?

TreeNode打印 twig 并为其上色

在保留列表元素属性的同时替换列表元素

如何根据R中其他变量的类别汇总值?

列名具有特殊字符时的循环回归

如何在使用箭头R包(箭头::OPEN_DATASSET)和dplyr谓词时编写具有整齐计算的函数?

ggplot R:X,Y,Z使用固定/等距的X,Y坐标绘制六边形热图

多元正态分布的计算

为什么不能使用lApply在包装函数中调用子集

从单个html段落中提取键-值对

用LOOCV进行K近邻问题

Gg森林未显示其中一个变量的引用组

通过时间差和复制在R中创建序列

Pairwise_t_test()不返回统计数据和估计

R:迭代推算\回补缺失值的函数

在GROUP_BY之前删除NAS并在用户定义的函数中汇总