6. ggplot图层-after_stat()在做什么?
2022-09-08 本文已影响0人
心惊梦醒
在增加一个layer之前,思考下每个layer的目的,一般来说,一个layer有三种目的:1)展示data,这一层几乎出现在所有图像上。2)展示data的statistical summary,通常在data的基础上绘制。3)添加额外的metadata:context, annotations和references,在background和foreground上都很有用:map(映射)经常用作background layer。
scales控制从data到aesthetics的映射并提供解释plot的工具(如:axes和legends)。
a scale defines a mapping from the data space to the aesthetic space
以下两行代码是等价的,对初学者来说,似乎有些难以理解:
ggplot(mpg, aes(x = displ)) + geom_histogram()
ggplot(mpg, aes(x = displ, y = after_stat(count))) + geom_histogram()
# ggplot(mpg,aes(x=displ,y=..count..)) + geom_histogram()
# ggplot(mpg,aes(x=displ,y=stat(count))) + geom_histogram()
# 最后两行是第二行的老版本,你可以在一些旧代码中看到
Every plot has two position scales, corresponding to the x and y aesthetics
大部分的aesthetics直接使用data中的variables进行映射(例如ggplot(mpg,aes(x=cty,y=hwy,color=class))+geom_point()
),但有时想在随后的渲染(即生成图像)过程中延迟map。ggplot2有三个时期的数据可用来做map(见??after_stat
):
- 直接在一开始使用用户提供的layer data(original layer data),如上述例子
- 使用被layer stat转换后的data(即stat transformed data),如上述代码块中等价的例子
- 被转换和被plot scales映射之后的data(即scaled data)
上述代码块中的例子,geom_histogram()
得到的柱子的高度不直接来自底层数据mpg,而是来自stat_bin()
计算得到的count
。after_stat()
标志着aesthetic mapping应该推迟到stat transformation之后。
# 这个例子将最高的柱子scale成1
ggplot(mpg, aes(displ)) +
geom_histogram(aes(y = after_stat(count / max(count))))
# 这个例子中,变量class映射到color(即scaled data),alpha()从scaled data中进一步scale,得到的值用于映射到fill
# alpha()是scale函数
ggplot(mpg, aes(class, hwy)) +
geom_boxplot(aes(colour = class, fill = after_scale(alpha(colour, 0.4)))