# How do I plot the estimated cumulative density function of some samples?

I have some samples of a random variable, and I want to plot their cdf. What’s the best way to do this?
I have currently tried:

``````    g1 = [E(λ) for i = 1:n] # generate the samples
using StatsBase
cdf = ecdf(g1)
xs = 0:10^-3:5
display(plot(y = [cdf(i) for i in xs], x = xs) #gadfly
``````

But this seems rather unidiomatic and inelegant. Any better ideas? Also, this only works for continuous variables, I think.

I don’t think you need anything fancy here:

``````using Plots
n = 50
g1 = [randn() for i = 1:n] # generate the samples

p = plot(sort(g1), (1:n)./n,
xlabel = "sample", ylabel = "Probability",
title = "Empirical Cumluative Distribution", label = "")
``````

6 Likes

You could also use the `plot(function, lower, upper)` method from `Plots`:

``````using Plots, StatsBase
g1 = randn(100)
gcdf = ecdf(g1)
plot(x -> gcdf(x), 0, 5)
``````
2 Likes

There’s also an example (`Geom.histogram`) in the Gadfly docs showing a sample and theoretical pdf (the latter is done using a layer with function).

`x -> gcdf(x)` is the same as just `gcdf`

2 Likes

Normally yes, but the `ECDF` object is not a function, so the `plot` doesn’t know to dispatch on it as such:

``````julia> plot(gcdf, 0, 5)
ERROR: Cannot convert ECDF{Array{Float64,1},Weights{Float64,Float64,Array{Float64,1}}} to series data for plotting
``````
4 Likes

is there a way to change the method signature of `plot` (either Gadfly’s or Plots’) to accommodate function-like objects like ECDF?