2014-09-06 92 views
7

我有一个DataFrame(data),带有一个简单的整数索引和5列。这些列是DateCountry,AgeGroup,Gender,Stat。 (更改名称以保护无辜者。)我想生成一个FacetGrid,其中Country定义该行,AgeGroup定义该列,并且Gender定义色相。对于每一个细节,我想制作一个时间序列图。即我应该得到一系列图表,每个图表有2个时间序列(1男1女)。我可以得到非常接近:使用Seaborn FacetGrid绘制时间序列

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

但是,这只是给我的X轴上的样本数量,而不是日期。在这种情况下是否有一个快速解决方案?

更一般地说,我知道FacetGrid的做法是让网格,然后map绘制一个函数。如果我想推出我自己的绘图功能,那么它需要遵循的约定是什么?特别是,如何编写我自己的绘图功能(传递给map以获得FacetGrid),该功能接受来自我的数据集的多列数据值?

+0

当你说“这只是给我的X轴上的样本数量而不是日期”,目前还不清楚日期应该来自哪里。这是数据框中的不同列吗? – mwaskom 2014-09-06 16:33:38

+0

是的,见上面,有一个名为Date的列,我想用它来生成有意义的x轴刻度。 – 8one6 2014-09-06 16:53:33

+0

哎呀,错过了,对不起。 – mwaskom 2014-09-06 17:34:17

回答

9

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

  • 他们必须采取类似阵列的输入,位置参数,以对应于所述x轴和对应于y轴的第二个参数的第一个参数(尽管更多关于第二个条件不久
  • 他们还必须接受两个关键字参数:colorlabel如果你想使用一个hue可变比这些应该得到传递给基础绘图功能,不过你可以赶上**kwargs与不做任何与他们有关的东西,如果它与你制作的具体情节无关
  • 当被调用时,他们必须在“当前活动的”matplotlib轴上绘制一个图形。

有可能是在您的函数绘制的曲线,看起来不正确服用xy,位置输入病例。我想这基本上是用你使用plt.plot的方式发生的。在使用map之后,您可以更轻松地拨打电话,例如g.set_axis_labels("Date", "Stat"),这将正确地重命名您的轴。您可能还想要g.set(xticklabels=dates)以获得更有意义的刻度。

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

因此,在特定情况下,你需要写,我们可以称之为plot_by_date应该是这个样子的函数:

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

    ... 

(我会更有益的身体,但我实际上并不知道如何用日期和matplotlib做很多事情)。最终的结果是,当你调用这个函数时,它应该绘制在当前活动的轴上。然后做

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

它应该工作,我认为。

+1

我的意思是,如果我想推出自己的功能,它应该返回什么?即说我想做一个愚蠢的函数,在'y = 2'的每个方面画一条水平线,忽略所有的输入数据。那么这个函数会是什么样子呢? – 8one6 2014-09-06 16:54:33

+2

啊,返回值被忽略....重要的是,函数*图*。实际上,对于这个特定的例子,你可以做'g.map(plt.axhline,y = 2)'。不知道这是否有助于你的一般理解。 – mwaskom 2014-09-06 17:31:19

+1

我已经增加了一些关于你正在做什么的具体内容。 – mwaskom 2014-09-06 17:38:57