从Seaborn distplot获取数据点

tes*_*goe 14 python matplotlib seaborn

我用

sns.distplot 
Run Code Online (Sandbox Code Playgroud)

绘制单变量的观测分布.不过,我不仅需要图表,还需要数据点.如何从matplotlib轴获取数据点(由distplot返回)?

Nil*_*dat 17

您可以使用matplotlib.patches API.例如,要获得第一行:

sns.distplot(x).get_lines()[0].get_data()
Run Code Online (Sandbox Code Playgroud)

这将返回两个包含该行的x和y值的numpy数组.

对于条形图,信息存储在:

sns.distplot(x).patches
Run Code Online (Sandbox Code Playgroud)

您可以通过以下功能访问酒吧的高度patches.get_height():

[h.get_height() for h in sns.distplot(x).patches]
Run Code Online (Sandbox Code Playgroud)

  • 这不是严格可靠的.如果在调用'distplot`之前在`Axes`上有任何行,你将从该行获得数据. (5认同)
  • 另一个提示:要获取 bin 左边缘、宽度和高度,请执行以下操作: `l = [[h.xy[0], h.get_width(), h.get_height()] for h in sns.distplot(x ).补丁]` (4认同)
  • 我刚刚测试了该解决方案,但它对我不起作用,因为“get_lines()”不是 FacetGrid 对象的有效方法。我已经成功使用这个答案:/sf/ask/3237384391/ (3认同)

小智 7

如果您想获取直方图的 kde 值,可以使用scikit-learn KernelDensity函数:

import numpy as np
import pandas as pd
from sklearn.neighbors import KernelDensity

ds=pd.read_csv('data-to-plot.csv')
X=ds.loc[:,'Money-Spent'].values[:, np.newaxis]


kde = KernelDensity(kernel='gaussian', bandwidth=0.75).fit(X) #you can supply a bandwidth
                                                              #parameter. 

x=np.linspace(0,5,100)[:, np.newaxis]

log_density_values=kde.score_samples(x)
density=np.exp(log_density_values)

array([1.88878660e-05, 2.04872903e-05, 2.21864649e-05, 2.39885206e-05,
       2.58965064e-05, 2.79134003e-05, 3.00421245e-05, 3.22855645e-05,
       3.46465903e-05, 3.71280791e-05, 3.97329392e-05, 4.24641320e-05,
       4.53246933e-05, 4.83177514e-05, 5.14465430e-05, 5.47144252e-05,
       5.81248850e-05, 6.16815472e-05, 6.53881807e-05, 6.92487062e-05,
       7.32672057e-05, 7.74479375e-05, 8.17953578e-05, 8.63141507e-05,
       ..........................
       ..........................
       3.93779919e-03, 4.15788216e-03, 4.38513011e-03, 4.61925890e-03,
       4.85992626e-03, 5.10672757e-03, 5.35919187e-03, 5.61677855e-03])
Run Code Online (Sandbox Code Playgroud)