Как показать cdf из данных гистограммы с помощью holoviews?

Я использую holoviews с боке для интерактивных визуализаций. У меня есть гистограмма с краями и частотными данными. Каков элегантный способ наложения моей гистограммы на кривую кумулятивного распределения (cdf)?

Я пробовал использовать параметр cumsum в hv.dim, но не думаю, что делаю это правильно. Помощь просто говорит,

Help on function cumsum in module holoviews.util.transform:
cumsum(self, **kwargs)

Мой код выглядит примерно так:

df_hist = pd.DataFrame(columns=['edges', 'freq'])
df_hist['edges'] = [-2, -1, 0, 1, 2]
df_hist['freq'] = [1, 3, 5, 3, 1]

hv.Histogram((df_hist.edges, df_hist.freq))

Результатом является график гистограммы.

Есть что-то вроде...

hv.Histogram((df_hist.edges, df_hist.freq), type='cdf') ...показать кумулятивное распределение?


person Nirjhor Chakraborty    schedule 16.09.2019    source источник


Ответы (1)


Одним из возможных решений является использование гистограммы(cumulative=True) следующим образом:

from holoviews.operation import histogram

histogram(hv.Histogram((df_hist.edges, df_hist.freq)), cumulative=True)

Подробнее о преобразовании элементов здесь:
http://holoviews.org/user_guide/Transforming_Elements.html< /а>


Или более общее решение, превратив исходные данные в hv.Dataset():

import holoviews as hv
import seaborn as sns
hv.extension('bokeh')

iris = sns.load_dataset('iris')

hv_data = hv.Dataset(iris['petal_width'])

histogram(hv_data, cumulative=True)


Но мне нравится использовать библиотеку
hvplot, которая построена поверх Holoviews, даже больше:

import hvplot
import hvplot.pandas

iris['petal_width'].hvplot.hist(cumulative=True)

hvplot кумулятивная гистограмма

person Sander van den Oord    schedule 16.09.2019
comment
Большое спасибо. Я не знал о cumulative=True. Это, безусловно, отвечает на вопросы так, как я их задавал, и даже больше. Я как бы надеялся, что кумулятивная кривая перекроет мою основную гистограмму. Есть ли простой способ сделать это? Я полагаю, что мог бы превратить ваше решение в разброс или кривую, а затем наложить его на гистограмму, если нет лучшего способа. - person Nirjhor Chakraborty; 18.09.2019
comment
@NirjhorChakraborty Вы можете сделать что-то вроде: iris['petal_width'].hvplot.hist() * iris['petal_width'].hvplot.hist(cumulative=True).to.scatter() Можете ли вы принять мой ответ как решение на ваш вопрос? - person Sander van den Oord; 18.09.2019
comment
Да. это сработает. Спасибо!. Кроме того, я проголосовал за ваш ответ, не понимая, что могу его принять. Извини за это. Приняли это правильно сейчас. Благодарю вас! - person Nirjhor Chakraborty; 21.09.2019