精简版
在 ggplot2
中,我必须做什么才能在 x
或 y
中应用一个美学函数拆分数据
(例如使用group
或color
)?
长版
我正在尝试找到一种方法让 ggplot
在绘图时在组内应用函数。
激励示例
假设我们有一群人,他们都有一个隐藏的值(value)。这些隐藏值的排名(以及 CDF)被公开。
my_data <- data.table(class = sort(rep(x = c('a','b','c'), times = 3)))
hidden <- c(10, 15, 80,
0, 50, 100,
5, 90, 95)
my_data[, rank := ecdf(hidden)(hidden)]
我可以使用整体 CDF 来推断类内部的 CDF。然后我想绘制每个类的 CDF 与整体 CDF 的关系图,这有助于我查看隐藏值的分布在类之间是否一致。
我最好的尝试
经过几次迭代,我很惊讶这不起作用。我认为通过将组设置为最高级别的审美,该功能将以与统计数据相同的方式应用。相反,ecdf(rank)(rank)
再次应用于整个列,这导致 y
等于 x
。
ggplot(data = my_data, mapping = aes(color = class)) +
geom_line(mapping = aes(
x = rank,
y = ecdf(rank)(rank)
))
这是一个在 color
级别应用统计信息的示例。
ggplot(data = data, mapping = aes(color = class)) +
geom_density(mapping = aes(
x = rank,
y = ..scaled..
))
我最好的解决方法
通过 split-apply-combine 的魔力(此处使用 data.table
中的 by
完成),我可以向我的数据添加一个额外的列来完成此操作。
data[, class_rank := ecdf(value)(value), class]
ggplot(data = data, mapping = aes(color = class)) +
geom_line(mapping = aes(
x = rank,
y = class_rank
))
在我的数据上添加额外的列并不是最糟糕的事情,但是 ggplot2
已经做了足够多的很棒的事情,我觉得它就在那里,但我就是找不到它。
最佳答案
- 美学被映射到表达式返回的值
rhs of = 应用于通过
data
传递的数据。分组依据 映射其他美学在这一点上没有效果。 - 分组仅影响绘图层内的操作,因此应用分组的唯一方法 关于分组的函数在 ggplot 统计中。
- 应用函数的统计数据的好例子是
stat_summary()
和stat_smooth()
。
因此,我认为实现您在“ggplot2”中提出的要求的唯一方法是使用一种尚不存在的美学。定义一个新的统计数据来总结 x
美学忽略组和 y
美学尊重分组应该是可行的,我认为,但值得付出努力吗?人们可以轻松地预处理“tidyverse”中的数据,如下所示,或者像您自己的示例中那样使用“data.table”...
library(ggplot2)
library(dplyr)
my_data <- data.frame(class = sort(rep(x = c('a','b','c'), times = 3)),
hidden = c(10, 15, 80, 0, 50, 100, 5, 90, 95))
my_data %>%
mutate(rank = ecdf(hidden)(hidden)) %>%
group_by(class) %>%
mutate(class_rank = ecdf(hidden)(hidden)) %>%
ggplot(aes(rank, class_rank, color = class)) +
geom_line()
关于r - 在 ggplot2 的组级别应用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51296549/