繁体   English   中英

R:Plot ecdf 在另一列的轴上使用 ggplot

[英]R: Plot ecdf of one column on an axis of another column with ggplot

我确信这可以通过单独收集所有数据然后仅使用 ggplot 进行绘图来完成,但我真的更喜欢实现 ggplot 的更简单的解决方案,特别是 stat_ecdf() 因为更容易访问分组变量、方面等.

我的 dataframe 除其他外包含两列相应的数据 x 和 y。 我想 plot y 的 ecdf 在相应 x 值的轴上。 换句话说,我想 plot 在其对应的 x 值处达到 y 变量的累积部分。 虽然 x 和 y 是相关的(都是降序的),但它们没有解析连接,所以我不能简单地将 y 的值缩放到 x。 我尝试通过单独计算每个子集的 ecdf 函数来做到这一点变得非常混乱和复杂,而 stat_ecdf function 似乎非常接近我需要的东西。

如果我将 ggplot aes 中的 x 变量设置为 x,然后将 stat_ecdf 中的变量设置为 y,我可以得到轴标签为 x 的 y 的 ecdf; 但是,轴上的实际值对应于 x。 我正在密谋这是通过以下方式完成的:

ggplot(df, aes(x, color=group_var)) + stat_ecdf(aes(y))

编辑:可视化:此示例 plot显示了多个组的 x 的 ecdf。 每个 x 值在排序后的 dataframe 中都有一个对应的 y 值(近似关系,忽略末尾的递减区域。我想有一个类似的 plot ,其中水平轴在相应的 y 值中。基本上,我需要 Z45178DC8ED4FE214第一个 ecdf plot 从 x-> y 的水平轴尽可能简单。我可以通过在 dataframe 中添加 ecdf 值作为列来手动执行此操作,但如果可能的话,我希望在 ggplot 中执行此操作。

与其试图让stat_ecdf去做一些它不是为它设计的事情,不如在代码中明确说明你的意图。

这很简单。 最奇怪的一段代码: ecdf(y)(y) menas '计算y的经验 CDF,然后根据我的数据中y的实际值对其进行评估。 cummax处理递减的y ,以使 eCDF 沿着x不断增加。

d_sample %>%
  group_by(group) %>%
  arrange(group, x) %>%
  mutate(
    fraction = ecdf(y)(y),
    maxf = pmax(fraction, cummax(fraction))) %>%
  ggplot(aes(x, maxf)) +
  geom_point() +
  facet_wrap(~group)

样本数据的 ecdf

我仍然不确定这是否是您需要的。

样本数据

老实说,我花了大部分时间来“伪造”你的数据集:

library(tidyverse)

tibble(x = seq_len(300) + 100) %>%
  mutate(
    one = - 1e-3 * (x * x) + 50 + 0.7 * x,
    two = - 1e-3 * (x * x) + 55 + 0.68 * x,
    three = - 1e-3 * (x * x) + 110 + 0.5 * x,
    four = - 1e-3 * (x * x) + 10 + 0.8 * x) %>%
  pivot_longer(-x, names_to = "group", values_to = "y") %>%
  filter(
    group == "one"
    | group == "two"
    | (group == "three" & x < 200)
    | (group == "four" & x > 250)) ->
  d_sample

d_sample %>%
  ggplot(aes(x, y, colour = group)) +
  geom_point()

样本数据散点图

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM