9

我有一个data带有简单整数索引和 5 列的 DataFrame ()。列是Date, Country, AgeGroup, Gender, Stat。(更改名称以保护无辜者。)我想生成一个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对其进行绘图。如果我想推出自己的绘图功能,它需要遵循哪些约定?特别是,我如何编写自己的绘图函数(传递给mapfor FacetGrid)来接受来自我的数据集的多列数据?

4

1 回答 1

10

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

  • 它们必须将类似数组的输入作为位置参数,第一个参数对应于 x 轴,第二个参数对应于 y 轴(不过,稍后会详细介绍第二个条件
  • 它们还必须接受两个关键字参数:colorlabel。如果你想使用一个hue变量,那么这些应该被传递给底层的绘图函数,但**kwargs如果它与你正在制作的特定绘图无关,你可以只捕获它们而不对它们做任何事情。
  • 调用时,它们必须在“当前活动的”matplotlib 轴上绘制图。

在某些情况下,您的函数绘制的图看起来正确,而无需使用x, y, 位置输入。我认为这基本上就是您使用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)。最终结果是,当您调用此函数时,它应该在当前活动的轴上绘图。然后做

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

我认为它应该有效。

于 2014-09-06T16:43:53.827 回答