[英]Cumulative distribution function of count as ratio for subset of data
我正在嘗試從一個 plot 上的多個數據中的 plot CDF 獲取子集范圍。 我將它們子集化,因為值可能非常大,並且我不希望 x 軸范圍很大。 無論子集范圍如何,CDF 始終具有從 0 到 1 的 y 軸范圍。由於數據存在於子集范圍之外,CDF 永遠不應 go 為 1,而是略小的比率。 我如何 go 計算整個分布的 CDF,然后在 plot 中對它們進行子集化?
此代碼繪制 CDF,但它們不考慮存在超出 x 軸范圍的數據。 在 x=50 或附近,y=1,這是不可能的。 我嘗試了其他一些stat_ecdf
選項(下面注釋#
),但沒有成功。
library(moments)
library(ggplot2)
library(plyr)
library(dplyr)
library(reshape2)
library(RColorBrewer)
library(cowplot)
library(scales)
library(gridExtra)
require(data.table)
require(grid)
set.seed(8)
dat1 <- data.frame(a = replicate(1,sample(25:300,1000,rep=TRUE)))
dat2 <- data.frame(b = replicate(1,sample(25:350,950,rep=TRUE)))
dat3 <- data.frame(c = replicate(1,sample(25:400,965,rep=TRUE)))
dat4 <- data.frame(d = replicate(1,sample(25:450,970,rep=TRUE)))
d1_bind = bind_rows(dat1,dat2,dat3,dat4)
md1 <- melt(d1_bind)
colnames(md1) <- c("Dat","Value")
summary(md1)
ggplot(md1, aes(x = Value, color=Dat, linetype=Dat)) +
stat_ecdf(aes(color = Dat),
# pad = TRUE, # this does not plot correctly
# n = 38850, # this or set to NULL does not plot correctly
geom = "line", size = 1) +
scale_linetype_manual(values=c("solid", "solid", "solid", "solid")) +
scale_y_continuous(limits = c(0, 1.0), breaks = seq(0, 1.0, by = 0.05)) +
scale_x_continuous(limits = c(25, 50)) +
# scale_x_discrete(breaks = 26:451) + # this does not plot correctly
scale_color_manual(values = c("#000000", "#E69F00", "#56B4E9", "#009E73"))
quit()
使用stat_bin
並手動計算累積和,得到與上面的 stat_ecdf 相同的stat_ecdf
。
ggplot(md1, aes(x = Value, color=Dat, linetype=Dat)) +
stat_bin(aes(y = cumsum(..count..)/sum(..count..)),
geom = "line", size = 1) +
scale_linetype_manual(values=c("solid", "solid", "solid", "solid")) +
scale_y_continuous(limits = c(0, 1.0), breaks = seq(0, 1.0, by = 0.05)) +
scale_x_continuous(limits = c(25, 50)) +
scale_color_manual(values = c("#000000", "#E69F00", "#56B4E9", "#009E73"))
您的代碼和以下代碼給出,這是我所期望的:
library(dplyr)
library(tidyr)
library(ggplot2)
set.seed(8)
dat1 <- data.frame(a = replicate(1,sample(25:300,1000,rep=TRUE)))
dat2 <- data.frame(b = replicate(1,sample(25:350,950,rep=TRUE)))
dat3 <- data.frame(c = replicate(1,sample(25:400,965,rep=TRUE)))
dat4 <- data.frame(d = replicate(1,sample(25:450,970,rep=TRUE)))
df <- bind_rows(dat1, dat2, dat3, dat4, .id = "dat")
df1 <- df %>%
pivot_longer(cols = a:d, values_drop_na = T)
ggplot(df1, aes(x = value, color = dat, linetype = dat)) +
stat_ecdf(aes(color = dat))
如果您想在不重新計算 ECDF 的情況下設置限制(即在圖表上“放大”),則使用coord_cartesian
而不是scale_x_continuous
:
ggplot(df1, aes(x = value, color = dat, linetype = dat)) +
stat_ecdf() +
coord_cartesian(xlim = c(25, 50),
ylim = c(0, 0.1))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.