在ggplot2中的组级别应用功能

时间:2018-07-12 02:32:16

标签: r ggplot2

短版

ggplot2中,为使美学的xy内部具有功能,我必须要做的是拆分data(例如,使用groupcolor)?

长版

我正在尝试找到一种方法来让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)
  ))

lines all on top of each other

在此示例以color级别应用统计信息。

ggplot(data = data, mapping = aes(color = class)) +
  geom_density(mapping = aes(
    x = rank,
    y = ..scaled..
  ))

enter image description here

我最好的解决方法

通过拆分应用组合(在此使用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
  ))

individual CDFs

在我的数据上添加额外的列并不是最坏的事情,但是ggplot2已经做了足够了不起的事情,我觉得这已经存在了,但我找不到它。

1 个答案:

答案 0 :(得分:2)

  1. 美学被映射到表达式上的表达式返回的值 =的rhs应用于通过data传递的数据。分组依据 映射其他美学在这一点上没有效果。
  2. 分组仅影响绘图图层内的操作,因此,应用分组的唯一方法是 关于分组的功能在ggplot统计信息内。
  3. 应用函数的统计数据的好例子是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()