这个问题似乎一次涉及到ggplot包的多个级别,但是我会尽力提供一些信息。几乎不可能在一个堆栈溢出的答案中描述ggplot的整个继承系统,但是指向正确的函数可能有助于您入门。
在顶层,数据映射和美学映射都从ggplot主调用继承。在下面的代码中,geom_point()
继承了映射和数据:
ggplot(iris,aes(Sepal.Width,Sepal.Length)) +
geom_point()
除非您明确提供替代映射并将继承设置为false:
ggplot(iris,Sepal.Length)) +
geom_point(aes(Petal.Width,Petal.Length),inherit.aes = FALSE)
接下来,在各个图层的级别上,某些默认值是从统计信息,地理信息或位置继承的。考虑以下情节:
df <- reshape2::melt(volcano)
ggplot(df,aes(Var1,Var2)) +
geom_raster()
栅格将为深灰色,因为我们尚未指定填充映射。通过查看其ggproto
对象,您可以了解默认的几何/统计信息:
> GeomRaster$default_aes
Aesthetic mapping:
* `fill` -> "grey20"
* `alpha` -> NA
> StatDensity$default_aes
Aesthetic mapping:
* `y` -> `stat(density)`
* `fill` -> NA
了解layer()
代码是了解层如何被赋予参数的另一个关键要素。具体来说,此位(为简化起见缩写):
function (geom = NULL,stat = NULL,data = NULL,mapping = NULL,position = NULL,params = list(),inherit.aes = TRUE,check.aes = TRUE,check.param = TRUE,show.legend = NA,key_glyph = NULL,layer_class = Layer)
{
...
aes_params <- params[intersect(names(params),geom$aesthetics())]
geom_params <- params[intersect(names(params),geom$parameters(TRUE))]
stat_params <- params[intersect(names(params),stat$parameters(TRUE))]
...
ggproto("LayerInstance",layer_class,geom = geom,geom_params = geom_params,stat = stat,stat_params = stat_params,data = data,mapping = mapping,aes_params = aes_params,position = position,inherit.aes = inherit.aes,show.legend = show.legend)
}
在这里您可以看到,无论您提供什么参数,都将根据stat / geom / position的有效参数对其进行检查,并将其分配到图层的相应部分。从上次调用中可以看到,将创建一个Layer ggproto对象。此类的父级不会导出,但是您仍然可以检查该对象内部的功能。例如,如果您对如何评估美学感到好奇,则可以输入:
ggplot2:::Layer$compute_aesthetics
您可以在其中看到一些比例尺的默认值也已合并到此处。当然,如果您不了解调用这些层函数的操作顺序,那么这些层做什么就没有多大意义。为此,我们可以看一下图构建器(为清楚起见,也缩写为):
> ggplot2:::ggplot_build.ggplot
function (plot)
{
...
data <- by_layer(function(l,d) l$setup_layer(d,plot))
...
data <- by_layer(function(l,d) l$compute_aesthetics(d,plot))
data <- lapply(data,scales_transform_df,scales = scales)
...
data <- layout$map_position(data)
data <- by_layer(function(l,d) l$compute_statistic(d,layout))
data <- by_layer(function(l,d) l$map_statistic(d,plot))
scales_add_missing(plot,c("x","y"),plot$plot_env)
data <- by_layer(function(l,d) l$compute_geom_1(d))
data <- by_layer(function(l,d) l$compute_position(d,layout))
...
data <- by_layer(function(l,d) l$compute_geom_2(d))
data <- by_layer(function(l,d) l$finish_statistics(d))
...
structure(list(data = data,layout = layout,plot = plot),class = "ggplot_built")
}
由此可见,首先要设置图层,然后计算美观度,然后应用比例转换,然后计算统计量,然后计算一部分几何图形,然后计算位置,最后重置几何
这意味着您输入的统计转换将受到比例转换的影响,而不受坐标转换的影响(稍后将进行其他介绍)。
如果您遍历代码,则直到这一点为止,几乎所有与主题相关的内容都没有得到评估(某些方面的主题评估除外)。如您所见,构建函数返回类ggplot_build
的对象,该对象仍然不是图形输出。主题元素的解释和几何图形对网格图形的实际解释发生在以下功能中:
ggplot2:::ggplot_gtable.ggplot_built
此功能之后,您将拥有一个grid::grid.draw()
可以解释的gtable对象,该对象将输出到图形设备。
不幸的是,我对主题元素的继承不是很精通,但是正如Jon Spring在评论中指出的那样,一个很好的起点是文档。
希望我已经指出了在ggplot中寻找继承模式的函数。
本文链接:https://www.f2er.com/3106187.html