将 geom_bar 宽度默认值更改为另一个默认值
Change geom_bar width default to another default
我想做什么
我目前有一个自定义主题用于我的地块,我想在此基础上为所有类型的地块设置一些预定义参数。我首先关注的是条形图,我想在其中更改默认宽度。
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_* 函数?
谢谢!
默认定义在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$width
中设置一个默认值是NULL
(这是geom_bar
中的默认值,NULL
表示 "set it to something reasonable for me").
没有像 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()
我想做什么
我目前有一个自定义主题用于我的地块,我想在此基础上为所有类型的地块设置一些预定义参数。我首先关注的是条形图,我想在其中更改默认宽度。
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_* 函数?
谢谢!
默认定义在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$width
中设置一个默认值是NULL
(这是geom_bar
中的默认值,NULL
表示 "set it to something reasonable for me").
没有像 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()