0

当通过下面的代码绘图时,我得到 c、d、e 绘图,但我只得到 plt.plot 的最后一个绘图

def normalize(x):
    return (x - x.min(0)) / x.ptp(0)
c=sns.distplot(mk[0]['mass'], hist=True, label='p', rug=True)
d=sns.distplot(mk[1]['mass'], hist=True, label='q', rug=True)
e=sns.distplot(mk[2]['mass'], hist=True, label='r', rug=True)
datadist=[c,d,e]
xd=dict()
yd2=dict()
for i in datadist:
    line = i.get_lines()[0]
    xd[i] = line.get_xdata()
    yd = line.get_ydata()   
    yd2[i] = normalize(yd)
plt.plot(xd[c], yd2[c],color='black')
plt.plot(xd[d], yd2[d],color='yellow')
plt.plot(xd[e], yd2[e],color='green')
4

1 回答 1

1

sns.distplot()返回ax绘制直方图的(子图)。所有 3 都绘制在同一个子图上,因此返回值是相同的 3 次。

该数组lines = ax1.get_lines()正好包含 3 个元素:每个 kde 曲线一个,因此您可以按如下方式提取它们:

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

def normalize(x):
    return (x - x.min(0)) / x.ptp(0)

fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(14, 4))
sns.distplot(np.random.randn(30) + 10, hist=True, label='p', rug=True, ax=ax1, color='black')
sns.distplot(np.random.randn(30) + 15, hist=True, label='q', rug=True, ax=ax1, color='gold')
sns.distplot(np.random.randn(30) + 20, hist=True, label='r', rug=True, ax=ax1, color='green')

for line in ax1.get_lines():
    ax2.plot(line.get_xdata(), normalize(line.get_ydata()), color=line.get_color())
plt.show()

示例图

现在,如果您只想要 kde 曲线并“标准化”它们,您可以使用scipy.stats import gaussian_kde

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

def normalize(x):
    return (x - x.min(0)) / x.ptp(0)

fig, ax = plt.subplots(figsize=(12, 4))

mk0mass = np.random.randn(30) + 10
mk1mass = np.random.randn(30) + 15
mk2mass = np.random.randn(30) + 20
all_mkmass = [mk0mass, mk1mass, mk2mass]
x = np.linspace(min([mki.min() for mki in all_mkmass]) - 2,
                max([mki.max() for mki in all_mkmass]) + 2, 1000)
for mki, color in zip(all_mkmass, ['black', 'gold', 'green']):
    kde = gaussian_kde(mki)
    yd = normalize(kde(x))
    ax.plot(x, yd, color=color)
    ax.fill_between(x, 0, yd, color=color, alpha=0.3)
plt.show()

示例绘图标准化 kdes

于 2021-01-19T20:35:02.683 回答