Si te gusta linspace
y prefiere una sola línea, que puede hacer:
plt.plot(np.sort(a), np.linspace(0, 1, len(a), endpoint=False))
Teniendo en cuenta mis gustos, casi siempre hago:
# a is the data array
sorted_ = np.sort(a)
yvals = np.arange(len(sorted_))/float(len(sorted_))
plt.plot(sorted_, yvals)
que funciona para mí, incluso si no son >O(1e6)
valores de datos. Si realmente necesita la muestra abajo fijaría
sorted_ = np.sort(a)[::down_sampling_step]
Editar para responder a comentar/edición el por qué uso o la endpoint=False
yvals
como se definió anteriormente. Los siguientes son algunos detalles técnicos.
La CDF empírica es usualmente definido formalmente como
CDF(x) = "number of samples <= x"/"number of samples"
con el fin de coincidir exactamente con esta definición formal de lo que tendría que utilizar yvals = np.arange(1,len(sorted_)+1)/float(len(sorted_))
de modo que consigamos yvals = [1/N, 2/N ... 1]
. Este estimador es un estimador insesgado que convergerá al verdadero CDF en el límite de muestras infinitas Wikipedia ref..
que tienden a utilizar yvals = [0, 1/N, 2/N ... (N-1)/N]
ya que (a) es más fácil de código/más idiomáticas, (b), pero aún se justifica formalmente desde siempre se puede intercambiar CDF(x)
con 1-CDF(x)
en la prueba de convergencia, y (c) trabaja con el (fácil) método de reducción de muestreo descrito anteriormente.
En algunos casos particular, es útil definir
yvals = (arange(len(sorted_))+0.5)/len(sorted_)
que es intermedia entre estas dos convenciones. Que, en efecto, dice "hay una probabilidad de 1/(2N)
de un valor inferior al más bajo que he visto en mi muestra, y una probabilidad de 1/(2N)
de un valor mayor que el más grande que he visto hasta ahora.
Sin embargo, para muestras grandes y distribuciones razonables, la convención dada en el cuerpo principal de la respuesta es fácil de escribir, es un estimador insesgado del verdadero CDF y funciona con la metodología de reducción de muestreo.
: este código en realidad no le dan la CDF empírica (una función escalonada aumentando en 1/n en cada uno de los n puntos de datos). En cambio, este código proporciona una estimación de la CDF basada en una estimación del PDF basada en un histograma. Esta estimación basada en el histograma puede ser manipulada/sesgada mediante la selección cuidadosa/inadecuada de los contenedores, por lo que no es una caracterización tan buena de la verdadera CDF como la ECDF real. –
También me desagrada el punto de que esto impone el binning; vea la respuesta corta de Dave, que simplemente usa 'numpy.sort' para trazar el CDF sin binning. –