построение ограниченного CDF дискретных данных подсчета в matplotlib python

У меня есть массив "данные" numpy, который просто содержит набор целых чисел. Учитывая другой массив «бункеров», я просто хочу сделать частотный график / CDF доли от общего количества записей в «данных», которые имеют как минимум бункеры [0] - много подсчетов, по крайней мере бункеров [1] - много подсчетов и т. д. , и превратите его в гистограмму в matplotlib. Например, если:

data = [1, 4, 5, 10]
bins = [0, 5, 6, 7]

тогда результатом должна быть гистограмма с 0, 5, 6, 7 по оси x, а затем доля данных со значениями> = 0, затем значения> = 5 и т. д. Как я могу сделать этот вид «Дискретный» график CDF с указанными ячейками в matplotlib? Спасибо.


person Community    schedule 13.12.2011    source источник
comment
Тело вопроса описывает не CDF, а 1-CDF. Это немного сбивает с толку после прочтения заголовка.   -  person Steve Tjoa    schedule 13.12.2011


Ответы (1)


Если вы используете matplotlib, я предполагаю, что вы также используете numpy, поэтому вы можете просто пройти bins и определить долю data, такую ​​что data>bin, для всех data в datas и для всех bin в bins.

Для этого это может работать:

import numpy as np
# turn data into numpy array for easier manipulation
data2 = np.array(data)
n     = len(data2)

# calculate fractions for each bin in bins
# astype('float') because otherwise you end up doing integer arithmetic
fracs = [ sum(data2>=bin).astype('float')/n for bin in bins ]

Теперь просто постройте bins против fracs, например.

import matplotlib.pyplot as plt
plt.bar(bins,fracs)
plt.show()
person mathematical.coffee    schedule 13.12.2011
comment
Для удобства: см. numpy.cumsum. - person Steve Tjoa; 13.12.2011
comment
@SteveTjoa: поскольку cumsum не принимает аргумент bins, как его можно использовать здесь вместо этого? Это кажется актуальным, но я этого не вижу, если у вас есть пример, это было бы здорово. - person ; 23.12.2011