为什么seaborn在facet网格中反复渲染相同的图形?

时间:2017-04-20 01:46:51

标签: python pandas seaborn

我有以下pandas数据框:

Degree Entry_Year  Graduations  Non_Graduations  Graduation_Rate
0   AUDIT       2007          0.0              1.0         0.000000
1   AUDIT       2008          0.0              7.0         0.000000
2   AUDIT       2009          0.0              4.0         0.000000
3   AUDIT       2015          0.0              1.0         0.000000
4    CERT       2009          1.0              1.0        50.000000
5    CERT       2010          4.0              6.0        40.000000
6    CERT       2011          2.0              5.0        28.571429
7    CERT       2012          1.0              6.0        14.285714
8    CERT       2013          3.0              5.0        37.500000
9    CERT       2014          5.0              7.0        41.666667
10   CERT       2015          2.0              5.0        28.571429
11   CERT       2016          0.0              4.0         0.000000
12   CERT       2017          0.0              1.0         0.000000
13    COM       2007          0.0             15.0         0.000000
14    COM       2008          0.0             16.0         0.000000
15    COM       2009          0.0              7.0         0.000000
16     CR       2012          0.0              2.0         0.000000
17   DMIN       2007          2.0              3.0        40.000000
18     MA       2007          3.0              8.0        27.272727
19     MA       2008          3.0              4.0        42.857143
20     MA       2009          1.0              8.0        11.111111
21     MA       2010          4.0              3.0        57.142857
22     MA       2011          2.0              8.0        20.000000
23     MA       2012          8.0             10.0        44.444444
24     MA       2013          1.0              0.0       100.000000
25     MA       2014          0.0              2.0         0.000000
26     MA       2015          1.0              2.0        33.333333
27  MAPSC       2010          8.0              2.0        80.000000
28  MAPSC       2011          9.0             10.0        47.368421
29  MAPSC       2012          5.0              9.0        35.714286
..    ...        ...          ...              ...              ...
61    MTS       2008          2.0              4.0        33.333333
62    MTS       2009          4.0              5.0        44.444444
63    MTS       2010          5.0              7.0        41.666667
64    MTS       2011          1.0              5.0        16.666667
65    MTS       2012          4.0              5.0        44.444444
66    MTS       2013          8.0              8.0        50.000000
67    MTS       2014          1.0              5.0        16.666667
68    MTS       2015          5.0             19.0        20.833333
69    MTS       2016          0.0             19.0         0.000000
70    MTS       2017          0.0              6.0         0.000000

但是,当我运行以下代码将此数据绘制为构面网格时,网格只是一遍又一遍地打印相同的图形。这是我正在使用的代码:

import seaborn as sns
from matplotlib import pyplot as plt

sns.set(font_scale=1)
plot = sns.FacetGrid(df, col='Degree', col_wrap=6, despine=True)
plot = plot.map(sns.barplot, x='Entry_Year', y='Graduation_Rate', data=df, ci=None)
plot.set_xticklabels(rotation=45)
plot.fig.tight_layout(w_pad=1)
plt.show(plot)

以下是我得到的结果:

test_result

有谁知道为什么seaborn不使用Degree列为每个方面构建不同的图? (我即将开始通勤,但会在一个小时左右的时间内重新登机。)

1 个答案:

答案 0 :(得分:1)

删除data内的plot.map()参数,并使关键字args定位 - 应该这样做。以下是一些大致重现用例的示例数据:

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

start_date = '1995'
drange = pd.date_range(start_date, periods=20, freq='A').strftime('%Y')
possible_groups = ['AUDIT','CERT','COM']
groups = np.random.choice(possible_groups, len(drange), replace=True)
values = np.random.randint(0, 100, len(drange))

df = pd.DataFrame({'Entry_Year':drange, 'Degree':groups, 'Graduation_Rate':values})

sns.set(font_scale=1)
plot = sns.FacetGrid(df, col='Degree', col_wrap=6, despine=True)
plot = plot.map(sns.barplot, 'Entry_Year', 'Graduation_Rate', ci=None)
plot.set_xticklabels(rotation=45)
plot.fig.tight_layout(w_pad=1)
plt.show(plot)

facet grid