gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:00:01 25 4
gpt4 key购买 nike

精简版

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com