5

我想做的事

我目前有一个用于我的绘图的自定义主题,并且我希望在此之上为所有类型的绘图提供一些预定义的参数。我首先关注的是条形图,我想在其中更改默认宽度。

ggplot2 中 geom_bar 的默认宽度是“默认情况下,设置为数据分辨率的 90%。 ”(http://ggplot2.tidyverse.org/reference/geom_bar.html)。

我想将该默认值更改为75%。需要明确的是,我对像这样更改它感兴趣:

geom_bar(stat='identity', width=0.75)

因为这意味着我每次创建条形图时都必须指定它。我希望它成为新的默认值。

到目前为止我尝试了什么

我尝试使用以下方法更改宽度默认值:

update_geom_defaults("bar", list(width=0.75))

但后来我收到一条错误消息:Error: Aesthetics must be either length 1 or the same as the data (964): width. 我在想这可能是因为宽度是根据数据的分辨率计算的,我打电话的时候还没有update_geom_defaults

另外,我还意识到这width不是 bar 的默认 aes 的一部分:

GeomBar$default_aes
* colour   -> NA
* fill     -> "grey35"
* size     -> 0.5
* linetype -> 1
* alpha    -> NA

我的问题是:

  • 90% 的默认设置在哪里?
  • 我可以以任何方式更改它吗?
  • 如果没有,是否有另一种方法可以将一组预定义的参数传递给所有 geom_* 函数?

谢谢 !

4

1 回答 1

6

默认值定义在GeomBar

GeomBar <- ggproto("GeomBar", GeomRect,
  required_aes = c("x", "y"),

  setup_data = function(data, params) {
    data$width <- data$width %||%
      params$width %||% (resolution(data$x, FALSE) * 0.9)  ## <- right here
    transform(data,
      ymin = pmin(y, 0), ymax = pmax(y, 0),
      xmin = x - width / 2, xmax = x + width / 2, width = NULL
    )
  },

  draw_panel = function(self, data, panel_params, coord, width = NULL) {
    # Hack to ensure that width is detected as a parameter
    ggproto_parent(GeomRect, self)$draw_panel(data, panel_params, coord)
  }
)

标记的行使用%||%,用于在事件params$widthis中设置默认值NULL(这是 中的默认值geom_barNULL意思是“将其设置为对我来说合理的东西”)。

没有什么好方法update_geom_defaults可以改变这一点。你能做的就是让你自己geom_bar像这样:

geom_bar75 <- function (..., width = 0.75) {
  geom_bar(..., width = width)
}

这在大多数情况下都可以正常工作,即使用离散的 x 轴(因为分辨率为 1)。对于更复杂的情况,您可能需要调整或重新定义GeomBar自己。

ggplot(mpg, aes(class)) + geom_bar()
ggplot(mpg, aes(class)) + geom_bar75()

在此处输入图像描述

于 2017-07-13T09:13:11.840 回答