R,ggplot2:如何可视化ggplot2中图形对象的数据,属性和其他组件的继承或流?

我常常不确定ggplot2中图形对象的数据,属性和其他组件的确切元素是由哪些其他元素继承的,以及向下流动到默认值(例如geoms)的默认位置。在特定情况下,通常可以通过仔细阅读Hadley的ggplot2书来回答​​这些问题。但是我发现在ggplot2中对继承的总体流程进行某种形式的可视化很有用,而且我想知道是否有人看到,创建或知道如何创建这样的东西。同样,在一个规范级别(例如aes或主题)中出现并在另一个级别(例如geom或scale)中继承的默认值的紧凑列表对我来说非常有用,我怀疑很多人在学习如何使用ggplot2。

我会接受以下任何一种答案:

  1. 继承可视化(也许是网络?)或指针 一样。
  2. 用于构建继承可视化的代码或指向的指针 一样。
  3. 一种可选的非可视方法,使之变得轻松,或至少 更容易理解和记住这样的继承和答案 有关它的具体问题。
  4. 专门列出参数默认值的列表,显示它们的出现位置和 哪些辅助函数会继承它们,或通过代码来产生这样的子函数 列表。
yujunjie19860211 回答:R,ggplot2:如何可视化ggplot2中图形对象的数据,属性和其他组件的继承或流?

这个问题似乎一次涉及到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

大家都在问