r - 在 ggplot2 的组级别应用函数

标签 r ggplot2

精简版

ggplot2 中,我必须做什么才能在 xy 中应用一个美学函数拆分数据(例如使用groupcolor)?

长版

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

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

我最好的解决方法

通过 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
  ))

individual CDFs

在我的数据上添加额外的列并不是最糟糕的事情,但是 ggplot2 已经做了足够多的很棒的事情,我觉得它就在那里,但我就是找不到它。

最佳答案

  1. 美学被映射到表达式返回的值 rhs of = 应用于通过 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()

关于r - 在 ggplot2 的组级别应用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51296549/

相关文章:

r - 在 r ggplot 中的热图中裁剪地理边界

read.fwf 错误 "line x did not have 5 elements"- 可能是由于特殊字符

r - 重叠基因组范围

r - 将社区检测与连接组件分组 igraph R 相结合

r - ggplot2 上的箭头穿过路径。让剧情看起来更好

r - 如何巧妙地将文本标签放置在 ggplot2 中不同大小的点旁边?

r - 网格排列标题中的绘图

r - PCA分析去除质心

r - 采样对数正态分布到精确均值和sd

r - 如何将 x 标签移动到 R 中 ggplot 中的分面标签上