2017-07-13 149 views
3

我想做更改geom_bar宽度默认为别的默认

目前,我有我的地块自定义主题,我想对所有类型的地块,一些预定义的参数上面有什么。我的第一个重点是条形图,我想要更改默认宽度。

默认宽度在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_ *函数?

谢谢!

回答

3

默认为在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() 

enter image description here

+1

真棒!奇迹般有效。谢谢! – agatheblues