如何将权重传递给Seaborn FacetGrid [英] How to pass weights to a Seaborn FacetGrid

查看:67
本文介绍了如何将权重传递给Seaborn FacetGrid的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一组数据,我正在尝试使用Seaborn中的FacetGrid进行绘制.每个数据点都有一个与之关联的权重,我想在网格的每个面上绘制一个加权的直方图.

I have a set of data that I'm trying to plot using a FacetGrid in seaborn. Each data point has a weight associated with it, and I want to plot a weighted histogram in each of the facets of the grid.

例如,假设我有以下(随机创建的)数据集:

For example, say I had the following (randomly created) data set:

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

d = pd.DataFrame(np.array([np.random.randint(0, 6, 5000), 
                           np.random.normal(0, 1., 5000),
                           np.random.uniform(0, 1, 5000)]).T, 
                 columns=('cat', 'val', 'weight'))

此数据的结构如下:

   cat       val    weight
0    0 -0.844542  0.668081
1    0 -0.521177  0.521396
2    1 -1.160358  0.788465
3    0 -0.394765  0.115242
4    5  0.735328  0.003495

通常,如果我没有重量,我会像这样绘制它:

Normally, if I didn't have weights, I would plot it like this:

fg = sns.FacetGrid(d, col='cat', col_wrap=3)
fg.map(plt.hist, 'val')

这将构成一个直方图网格,其中每个直方图显示类别cat的一个值的变量val的分布.

This makes a grid of histograms where each histogram shows the distribution of the variable val for one value of the category cat.

我想做的是加权每个直方图.如果我要使用Matplotlib制作单个直方图,则可以执行以下操作:

What I would like to do is to weight each of the histograms. If I were making a single histogram with Matplotlib, I would do this:

plt.hist(d.val, weights=d.weight)

我尝试将weights参数传递给FacetGrid.map,但是由于seaborn在内部对数据进行切片以形成网格的方式而导致了错误:

I tried passing the weights argument to FacetGrid.map, but it raises an error due to the way seaborn slices the data internally to make the grid:

fg.map(plt.hist, 'val', weights=d.weight)

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-33-1403d26cff86> in <module>()
      9 
     10 fg = sns.FacetGrid(d, col='cat', col_wrap=3)
---> 11 fg.map(plt.hist, 'val', weights=d.weight)

/opt/conda/lib/python3.4/site-packages/seaborn/axisgrid.py in map(self, func, *args, **kwargs)
    443 
    444             # Draw the plot
--> 445             self._facet_plot(func, ax, plot_args, kwargs)
    446 
    447         # Finalize the annotations and layout

/opt/conda/lib/python3.4/site-packages/seaborn/axisgrid.py in _facet_plot(self, func, ax, plot_args, plot_kwargs)
    527 
    528         # Draw the plot
--> 529         func(*plot_args, **plot_kwargs)
    530 
    531         # Sort out the supporting information

/opt/conda/lib/python3.4/site-packages/matplotlib/pyplot.py in hist(x, bins, range, normed, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, color, label, stacked, hold, **kwargs)
   2894                       histtype=histtype, align=align, orientation=orientation,
   2895                       rwidth=rwidth, log=log, color=color, label=label,
-> 2896                       stacked=stacked, **kwargs)
   2897         draw_if_interactive()
   2898     finally:

/opt/conda/lib/python3.4/site-packages/matplotlib/axes/_axes.py in hist(self, x, bins, range, normed, weights, cumulative, bottom, histtype, align, orientation, rwidth, log, color, label, stacked, **kwargs)
   5647                 if len(w[i]) != len(x[i]):
   5648                     raise ValueError(
-> 5649                         'weights should have the same shape as x')
   5650         else:
   5651             w = [None]*nx

ValueError: weights should have the same shape as x

那么,有什么办法制作这样的情节吗?

So, is there any way to make a plot like this?

推荐答案

您需要在plt.hist周围编写一个小的包装函数,该函数接受权重向量作为位置参数.像

You'll need to write a little wrapper function around plt.hist that accepts a vector of weights as a positional argument. Something like

def weighted_hist(x, weights, **kwargs):
    plt.hist(x, weights=weights, **kwargs)

g = sns.FacetGrid(df, ...)
g.map(weighted_hist, "x_var", "weight_var")
g.set_axis_labels("x_var", "count")

这篇关于如何将权重传递给Seaborn FacetGrid的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆