繁体   English   中英

使用Seaborn FacetGrid绘制时间序列

[英]Plotting time series using Seaborn FacetGrid

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

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

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

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

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

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

在某些情况下,您的函数可以绘制一个看起来正确但不带xy位置输入的图。 我认为这与你使用plt.plot的方式基本上是plt.plot 在使用map之后,可以更容易地调用,例如g.set_axis_labels("Date", "Stat") ,这将正确地重命名轴。 您可能还想要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")

我认为它应该有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM