使用Seaborn FacetGrid绘制时间序列

时间:2014-09-06 15:55:51

标签: python matplotlib pandas seaborn

我有一个DataFrame(data),带有一个简单的整数索引和5列。列为DateCountryAgeGroupGenderStat。 (名称已更改以保护无辜者。)我想生成FacetGrid Country定义行,AgeGroup定义列,Gender定义色调。对于每个细节,我想制作一个时间序列图。即我应该得到一组图表,每个图表上都有2个时间序列(1个男性,1个女性)。我可以非常接近:

g = sns.FacetGrid(data, row='Country', col='AgeGroup', hue='Gender')
g.map(plt.plot, 'Stat')

然而,这只是给我x轴上的样本编号而不是日期。在这种情况下是否有快速解决方法。

更一般地说,我理解使用FacetGrid的方法是制作网格,然后map绘制函数。如果我想推出自己的绘图功能,它需要遵循哪些约定?特别是,我如何编写自己的绘图函数(传递给map FacetGrid),该函数接受来自我的数据集的多列数据?

1 个答案:

答案 0 :(得分:10)

我会先回答你一般的问题。您可以传递给FacetGrid.map的函数规则是:

  • 他们必须将类似数组的输入作为位置参数,第一个参数对应于x轴,第二个参数对应于y轴(不过,更多关于第二个条件
  • 他们还必须接受两个关键字参数:colorlabel。如果你想使用一个hue变量,那么这些变量应该被传递给底层的绘图函数,虽然你可以抓住**kwargs并且如果它与特定的情节无关,你就不做任何事情。决策。
  • 调用时,必须在“当前活动的”matplotlib轴上绘制一个图。

在某些情况下,您的函数会绘制一个看起来正确的图,而不需要xy,位置输入。我认为这与你使用plt.plot的方式基本上是一致的。在您使用g.set_axis_labels("Date", "Stat")后,可以更轻松地调用,例如map,这将正确地重命名您的轴。您可能还希望g.set(xticklabels=dates)获得更有意义的刻度。

还有一个更通用的功能FacetGrid.map_dataframe。这里的规则是相似的,但是您传递的函数必须在名为data的参数中接受数据框输入,而不是采用类似数组的位置输入,它采用与该数据帧中的变量对应的字符串。在通过构面的每次迭代中,将调用函数,并将输入数据框屏蔽为rowcolhue级别的组合的值。

因此,在您的具体情况下,您需要编写一个我们可以调用plot_by_date的函数,该函数看起来像这样:

def plot_by_date(x, y, color=None, label=None):

    ...

(我对身体更有帮助,但我实际上并不知道如何使用日期和matplotlib做多少)。最终结果是,当您调用此函数时,它应绘制在当前活动的Axes上。然后做

g.map(plot_by_date, "Date", "Stat")

它应该有用,我想。