2017-07-13 111 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