簡體   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