在ggplot2
中,为使美学的x
或y
内部具有功能,我必须要做的是拆分data
(例如,使用group
或color
)?
我正在尝试找到一种方法来让ggplot
在绘制时在组内应用函数。
假设我们有一个全部具有隐藏值的种群。这些隐藏值的等级(以及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..
))
通过拆分应用组合(在此使用by
中的data.table
完成的魔术),我可以在数据中添加一个额外的列来完成此操作。
data[, class_rank := ecdf(value)(value), class]
ggplot(data = data, mapping = aes(color = class)) +
geom_line(mapping = aes(
x = rank,
y = class_rank
))
在我的数据上添加额外的列并不是最坏的事情,但是ggplot2
已经做了足够了不起的事情,我觉得这已经存在了,但我找不到它。
答案 0 :(得分:2)
data
传递的数据。分组依据
映射其他美学在这一点上没有效果。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()