简短版本
在ggplot2中,我必须做什么才能在拆分x或y之后应用美学的data内的函数(例如使用group或color)?
长版本
鼓舞人心的例子
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的关系图,这有助于我查看隐藏值在类之间的分布是否一致。
我最好的尝试
经过几次迭代后,我很惊讶这不起作用。我认为,通过将组设置为最高级别的美学,该函数将以与统计数据相同的方式应用。相反,ecdf(rank)(rank)将再次应用于整个列,这将导致y等于x。
ggplot(data = my_data, mapping = aes(color = class)) +
geom_line(mapping = aes(
x = rank,
y = ecdf(rank)(rank)
))

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已经做了足够多很棒的事情,我觉得它就在那里,我就是找不到它。
发布于 2018-07-14 00:56:05
data传递的数据。通过映射其他美学进行分组在此point.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()https://stackoverflow.com/questions/51296549
复制相似问题