积累在ggplot2中的情节

时间:2012-12-08 01:52:52

标签: r ggplot2

是否可以在x轴上创建0%到100%的图表形式 y上的单位,从y = 0到y = max累积,所以我可以说“X的 我的元素出现在前Y个单位内。“是否有预定义的 ggplot2中的stat允许我这样做吗?

以下是一些数据:http://sprunge.us/XYJK

2 个答案:

答案 0 :(得分:1)

您可以在使用ggplot处理之前或在以下期间应用它:

例如:

library(ggplot2)
library(scales)
library(XML) 
x <- eval(parse(file("http://sprunge.us/XYJK"))) # Your data
d <- data.frame(x=x,y=1:length(x)) 
d$z <- cumsum(d$x) / sum(d$x) # As percent

ggplot(d, aes(z,y)) + geom_line() + scale_x_continuous(label=percent)

OR

library(ggplot2)
library(scales)
d <- data.frame(x=x,y=1:100)
ggplot(d, aes(cumsum(x)/sum(x),y) + geom_line() + scale_x_continuous(label=percent)

我假设这是销售数据或类似的东西。因此,在此背景下,50%的收入来自前5000次交易。

答案 1 :(得分:1)

听起来好像你正在寻找经验CDF。您的数据已在多个位置复制了值,因此我根据排序值的频率表创建了经验CDF。我将您的数据复制到矢量x中,然后执行以下操作:

tf <- as.data.frame(table(x), stringsAsFactors = FALSE)
tf <- within(tf, {
          Var1 <- as.numeric(Var1)
          pct <- 100 * cumsum(Freq)/sum(Freq)
                 } )
ggplot(tf, aes(x = Var1, y = pct)) + 
    geom_step(size = 1) +
    labs(x = "Value", y = "Cumulative percentage")

问题在于你的数据非常偏右,直方图模拟了一个双曲线,所以绝大多数数据远低于1000,有几个严重的异常值。为了给你一个想法,

quantile(x, c(0.005, 0.01, 0.05, 0.10, 0.25, 0.5, 0.75, 0.9, 0.95, 0.99, 0.995))
   0.5%          1%          5%         10%         25%         50% 
 1.64425      2.79850     7.54500    11.77500    21.76000    39.35000 
    75%         90%         95%         99%       99.5% 
 73.28000   398.05000   1695.78750 10499.99000 11638.55600

summary(tst$y)
Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
0.00    21.76    39.35   434.90    73.28 18520.00

平均值大于分布的第90个百分点!在这种情况下,我认为ecdf情节不会提供很多信息。要找出向量中的值的比例小于或等于给定值,请尝试以下小函数:

cumprop <- function(x, val) mean(x <= val)
cumprop(x, 1000)
cumprop(x, mean(x))  # proportion of values <= mean(x)