简而言之,当我的数据被加权时,分布式图形(直方图或kde)的最佳选择是什么?
df = pd.DataFrame({ 'x':[1,2,3,4], 'wt':[7,5,3,1] })
df.x.plot(kind='hist',weights=df.wt.values)
工作正常,但是seaborn不会接受权重kwarg,即
sns.distplot( df.x, bins=4, # doesn't work like this
weights=df.wt.values ) # or with kde=False added
如果kde接受砝码,但pandas和seaborn似乎都不允许它,这也会很好。
我意识到btw可以扩展数据以伪造加权,这在这里很容易,但对我的数据或数千的权重的真实数据没有多大用处,所以我不是在寻找像这样的解决方法。 / p>
无论如何,就是这样。我只是试图找出除了基本的熊猫直方图之外我可以用加权数据做什么(如果有的话)。我还没有骗过散景,但欢迎散景建议。
答案 0 :(得分:5)
您必须了解seaborn使用pandas使用的非常matplotlib绘图功能。
由于documentation状态,sns.distplot
不接受weights
参数,但它确实需要一个hist_kws
参数,该参数将被发送到{plt.hist
的基础调用{1}}。因此,这应该做你想要的:
sns.distplot(df.x, bins=4, hist_kws={'weights':df.wt.values})
答案 1 :(得分:0)
我通过根据数据重量重新采样数据点来解决这个问题。
你可以这样做:
`
from random import random
from bisect import bisect
def weighted_choice(choices):
values, weights = zip(*choices)
total = 0
cum_weights = []
for w in weights:
total += w
cum_weights.append(total)
x = random() * total
i = bisect(cum_weights, x)
return values[i]
samples = [([5, 0.5], 0.1), ([0, 10], 0.3), ([0, -4], 0.3)]
choices = np.array([weighted_choice(samples) for c in range(1000)])
sns.distributions.kdeplot(choices[:, 0], choices[:, 1], shade=True)