使用Seaborn FacetGrid绘制时间序列


问题内容

我有一个data带有简单整数索引和5列的DataFrame()。柱子是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绘制函数。如果要滚动自己的绘图功能,需要遵循哪些约定?特别是,如何编写自己的绘图函数(传递给mapfor
FacetGrid)以从数据集中接收多列数据?


问题答案:

首先,我将回答您的一般性问题。您可以传递的功能规则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)。最终结果是,当您调用此函数时,它应绘制在当前活动的轴上。然后做

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

我认为这应该有效。