使用Seaborn FacetGrid绘制时间序列

8on*_*ne6 9 python matplotlib pandas seaborn

我有一个DataFrame(data),它有一个简单的整数索引和5列.柱子是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')
Run Code Online (Sandbox Code Playgroud)

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

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

mwa*_*kom 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,而不是采用类似数组的位置输入,它需要与该数据帧中的变量相对应的字符串.通过刻面每一次迭代,该功能将被屏蔽,只是将值的该组合的输入数据帧调用row,colhue水平.

所以在你的特定情况下,你需要编写一个我们可以调用的函数,plot_by_date它应该是这样的:

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

    ...
Run Code Online (Sandbox Code Playgroud)

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

g.map(plot_by_date, "Date", "Stat")
Run Code Online (Sandbox Code Playgroud)

我认为它应该有效.

  • 这可能很有用:http://nbviewer.ipython.org/gist/mwaskom/9276378379d757fe0cc6 (4认同)
  • 啊,返回值被忽略....重要的是函数*绘制*.实际上,对于那个具体的例子,你可以做`g.map(plt.axhline,y = 2)`.不确定这是否有助于您的一般理解. (2认同)