Как построить оценку плотности ядра на графике рассеяния морской волны - PullRequest
0 голосов
/ 15 апреля 2020

Я бы хотел нарисовать так же, как показано на рисунке (но только красную часть). Кривая представляет собой оценку плотности ядра, основанную только на значениях X (значения y не имеют значения и фактически все 1,2 или 3. Здесь просто показано, как показано ниже, чтобы различить guish между красным и синим. Я построил график рассеяния, но как я могу включить кривую плотности ядра на графике рассеяния? (Черные пунктирные линии на кривой - это только квартили и медиана).

import seaborn as sns; sns.set()
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib.ticker import MaxNLocator
import matplotlib.pyplot as plt
from scipy.stats import norm
from sklearn.neighbors import KernelDensity
%matplotlib inline
# Change plotting style to ggplot
plt.style.use('ggplot')
from matplotlib.font_manager import FontProperties



X_plot = np.linspace(0, 30, 1000)[:, np.newaxis]

X1 = df[df['Zustandsklasse']==1]['Verweildauer'].values.reshape(-1,1)
X2 = df[df['Zustandsklasse']==2]['Verweildauer'].values.reshape(-1,1)
X3 = df[df['Zustandsklasse']==3]['Verweildauer'].values.reshape(-1,1)
#print(X1)



ax=sns.scatterplot(x="Verweildauer", y="CS_bandwith", data=df, legend="full", alpha=1)


kde=KernelDensity(kernel='gaussian').fit(X1)
log_dens = kde.score_samples(X_plot)
ax.plot(X_plot[:,0], np.exp(log_dens), color ="blue", linestyle="-", label="Gaussian Kernel")


ax.yaxis.set_major_locator(MaxNLocator(integer=True))
ax.invert_yaxis()
plt.ylim(5.5, .5)
ax.set_ylabel("Zustandsklasse")
ax.set_xlabel("Verweildauer in Jahren")


handles, labels = ax.get_legend_handles_labels()
# create the legend again skipping this first entry
leg = ax.legend(handles[1:], labels[1:], loc="lower right", ncol=2, facecolor='silver', fontsize= 7)

ax.set_xticks(np.arange(0, 30, 5))
ax2 = ax.twinx()
#get the ticks at the same heights as the left axis
ax2.set_ylim(ax.get_ylim())


s=[(df["Zustandsklasse"] == t).sum() for t in range(1, 6)]
s.insert(0, 0)

print(s)
ax2.set_yticklabels(s)
ax2.set_ylim(ax.get_ylim())
ax2.set_ylabel("Anzahl Beobachtungen")
ax2.grid(False)

#plt.tight_layout()
plt.show()

Цель построения Что изображено с кодом выше

1 Ответ

1 голос
/ 15 апреля 2020

Это намного проще, если вы используете подсюжеты. Вот пример с набором данных Титани c от Seaborn:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()

titanic = sns.load_dataset('titanic')

fig, ax = plt.subplots(nrows=3, sharex=True)
ax[2].set_xlabel('Age')

for i in [1, 2, 3]:
    age_i = titanic[titanic['pclass'] == i]['age']
    ax[i-1].scatter(age_i, [0] * len(age_i))
    sns.kdeplot(age_i, ax=ax[i-1], shade=True, legend=False)
    ax[i-1].set_yticks([])
    ax[i-1].set_ylim(-0.01)
    ax[i-1].set_ylabel('Class ' + str(i))

kde subplots

...