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.
nilshg
April 22, 2020, 5:18pm
2
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 = "")
7 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)
4 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).
ElOceanografo:
x → gcdf(x)
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?