R、 ggplot2:如何在ggplot2中可视化图形对象的数据、属性和其他组件的继承或流?
我常常不确定R、 ggplot2:如何在ggplot2中可视化图形对象的数据、属性和其他组件的继承或流?,r,inheritance,ggplot2,visualization,graph-visualization,R,Inheritance,Ggplot2,Visualization,Graph Visualization,我常常不确定ggplot2中图形对象的哪些数据元素、属性和其他组件是由哪些其他元素继承的,以及向下流动的默认值(例如几何图形)来自何处。在特定情况下,这些问题通常可以通过仔细阅读哈德利的《代码》ggplot2来回答。但是我会发现在ggplot2中对继承的整体流程进行某种可视化非常有用,我想知道是否有人见过、创建过或知道如何创建这样的东西。同样,在一个规范级别(如aes或主题)中出现并由另一个级别(如geom或scale)继承的一个紧凑的默认值列表对我来说非常有用,我怀疑对于许多学习如何使用ggp
ggplot2
中图形对象的哪些数据元素、属性和其他组件是由哪些其他元素继承的,以及向下流动的默认值(例如几何图形)来自何处。在特定情况下,这些问题通常可以通过仔细阅读哈德利的《代码》ggplot2来回答。但是我会发现在ggplot2
中对继承的整体流程进行某种可视化非常有用,我想知道是否有人见过、创建过或知道如何创建这样的东西。同样,在一个规范级别(如aes或主题)中出现并由另一个级别(如geom或scale)继承的一个紧凑的默认值列表对我来说非常有用,我怀疑对于许多学习如何使用ggplot2的人来说
我接受以下任何一项作为答案:
这个问题似乎是关于ggplot包的多个级别的,但我会尽力提供一些信息。几乎不可能在一个堆栈溢出答案中描述ggplot的整个继承系统,但是指出正确的函数可能有助于开始 在顶层,数据和美学映射都继承自主ggplot调用。在下面的代码中,
geom_point()
继承映射和数据:
ggplot(iris, aes(Sepal.Width, Sepal.Length)) +
geom_point()
除非明确提供替代映射并将继承设置为false:
ggplot(iris, aes(Sepal.Width, Sepal.Length)) +
geom_point(aes(Petal.Width, Petal.Length), inherit.aes = FALSE)
接下来,在各个层的级别上,从stats、geom或positions继承某些默认值。考虑下面的情节:
df <- reshape2::melt(volcano)
ggplot(df, aes(Var1, Var2)) +
geom_raster()
了解层是如何给定其参数的另一个关键因素是查看layer()
code。具体而言,此处的这一位(为清晰起见缩写):
在这里,您可以看到一些默认的比例也包含在这里。当然,如果您不了解调用这些层函数的操作顺序,那么这些层所做的事情就没有多大意义。为此,我们可以查看plot builder(为清晰起见,缩写):
完成此函数后,您将拥有一个gtable对象,该对象可由grid::grid.draw()
解释,该对象将输出到图形设备
不幸的是,我不太熟悉主题元素的继承,但正如Jon Spring在评论中指出的那样,一个好的起点是文档。
希望我已经指出了在ggplot中查找继承模式的函数。这个问题似乎是关于ggplot包的多个级别的,但我会尽力提供一些信息。几乎不可能在一个堆栈溢出答案中描述ggplot的整个继承系统,但是指出正确的函数可能有助于开始 在顶层,数据和美学映射都继承自主ggplot调用。在下面的代码中,
geom_point()
继承映射和数据:
ggplot(iris, aes(Sepal.Width, Sepal.Length)) +
geom_point()
除非明确提供替代映射并将继承设置为false:
ggplot(iris, aes(Sepal.Width, Sepal.Length)) +
geom_point(aes(Petal.Width, Petal.Length), inherit.aes = FALSE)
接下来,在各个层的级别上,从stats、geom或positions继承某些默认值。考虑下面的情节:
df <- reshape2::melt(volcano)
ggplot(df, aes(Var1, Var2)) +
geom_raster()
了解层是如何给定其参数的另一个关键因素是查看layer()
code。具体而言,此处的这一位(为清晰起见缩写):
在这里,您可以看到一些默认的比例也包含在这里。当然,如果您不了解调用这些层函数的操作顺序,那么这些层所做的事情就没有多大意义。为此,我们可以查看plot builder(为清晰起见,缩写):
完成此函数后,您将拥有一个gtable对象,该对象可由grid::grid.draw()
解释,该对象将输出到图形设备
不幸的是,我不太熟悉主题元素的继承,但正如Jon Spring在评论中指出的那样,一个好的起点是文档。
希望,我已经指出了在ggplot中寻找继承模式的函数。对于真正需要什么,似乎非常广泛和不清楚。(并且询问到外部资源的链接被视为超出了SO问题的范围。)查看ggplot2帮助文档的索引页几乎显示了一整页geoms。这个问题看起来确实相当广泛。如果在给定的ggplot2调用中谈论数据或美学,则它们仅从初始的
ggplot(…)
行继承,并且仅限于它们出现的范围。如果您谈论的是主题组件,那么其中的帮助将在父主题元素更改下游值的地方指定“从X继承”。关于真正需要什么,似乎相当广泛和不清楚。(并且询问到外部资源的链接被视为超出了SO问题的范围。)查看ggplot2帮助文档的索引页几乎显示了一整页geoms。这个问题看起来确实相当广泛。如果在给定的ggplot2调用中谈论数据或美学,则它们仅从初始的ggplot(…)
行继承,并且仅限于它们出现的范围。如果您谈论的是主题组件,那么其中的帮助将指定“从X继承”,只要父主题元素更改
> 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")
}
ggplot2:::ggplot_gtable.ggplot_built