【问题标题】:Change geom_bar width default to another default将 geom_bar 宽度默认更改为另一个默认值
【发布时间】:2017-07-13 09:04:18
【问题描述】:

我想做的事

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

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 不是默认 aes 的一部分:

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

我的问题是:

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

谢谢!

【问题讨论】:

    标签: r ggplot2 width bar-chart ggproto


    【解决方案1】:

    默认定义在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$widthNULL的情况下设置默认值(这是geom_bar中的默认值,NULL表示“将其设置为对我来说合理的值")。

    没有像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()
    

    【讨论】:

    • 太棒了!奇迹般有效。谢谢!
    猜你喜欢
    • 2012-10-19
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 2019-07-05
    相关资源
    最近更新 更多