Участок CDF с доверительным интервалом с использованием Seaborn - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь построить CDF из нескольких симуляционных прогонов, используя Seaborn.Я создал очень простой код для эмуляции моих результатов:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df1 = pd.DataFrame({'A':np.random.randint(0, 100, 1000)})    
df2 = pd.DataFrame({'A':np.random.randint(0, 100, 1000)})    
df3 = pd.DataFrame({'A':np.random.randint(0, 100, 1000)})

f, ax = plt.subplots(figsize=(8, 8))
ax = sns.kdeplot(df1['A'], cumulative=True)
ax = sns.kdeplot(df2['A'], cumulative=True)
ax = sns.kdeplot(df3['A'], cumulative=True)

plt.show()

Приведенный выше код создает следующий график: График CDF

Но, поскольку три строки являются результатамииз одной и той же симуляции с разными семенами, я бы хотел «объединить» три линии в одну и добавить заштрихованную область вокруг линии, представляющую min и max или std трех разных прогонов.

Как это можно сделать в Сиборне?

1 Ответ

0 голосов
/ 05 декабря 2018

Вы можете использовать fill_between для заполнения между двумя кривыми.Теперь здесь проблема в том, что поддержка kde будет отличаться для трех кривых.Для получения общей поддержки kde потребуется рассчитать cdf вручную.Это можно сделать следующим образом.

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt


def cdf(data, limits="auto", npoints=600):
    kde = stats.gaussian_kde(data)
    bw = kde.factor
    if limits == "auto":
        limits = (data.min(), data.max())
    limits = (limits[0]-bw*np.diff(limits)[0],
              limits[1]+bw*np.diff(limits)[0])
    x = np.linspace(limits[0], limits[1], npoints)
    y = [kde.integrate_box(x[0],x[i]) for i in range(len(x))]
    return x, np.array(y)


d1 = np.random.randint(14, 86, 1000)   
d2 = np.random.randint(10, 100, 1000) 
d3 = np.random.randint(0, 90, 1000) 

mini = np.min((d1.min(), d2.min(), d3.min()))
maxi = np.max((d1.max(), d2.max(), d3.max()))

x1,y1 = cdf(d1, limits=(mini, maxi))
x2,y2 = cdf(d2, limits=(mini, maxi))
x3,y3 = cdf(d3, limits=(mini, maxi))

y = np.column_stack((y1, y2, y3))
ymin = np.min(y, axis=1)
ymax = np.max(y, axis=1)  

f, ax = plt.subplots()

ax.plot(x1,y1)
ax.plot(x2,y2)
ax.plot(x3,y3)

ax.fill_between(x1, ymin, ymax, color="turquoise", alpha=0.4, zorder=0)

plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...