[英]Plotting time series using Seaborn FacetGrid
我有一个带有简单整数索引和5列的DataFrame( data
)。 列是Date
, Country
, AgeGroup
, Gender
, Stat
。 (名称已更改以保护无辜者。)我想生成一个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
到它。 如果我想推出自己的绘图功能,它需要遵循哪些约定? 特别是,我怎么能写我自己的绘图功能(要传递给map
为FacetGrid
接受多列从我的数据集的数据价值)?
我先回答你一般的问题。 您可以传递给FacetGrid.map
函数规则是:
color
和label
。 如果你想使用一个hue
变量,那么这些变量应该被传递给底层的绘图函数,尽管如果它与你正在制作的特定绘图无关,你可以抓住**kwargs
并且不对它们做任何事情。 在某些情况下,您的函数可以绘制一个看起来正确但不带x
, y
位置输入的图。 我认为这与你使用plt.plot
的方式基本上是plt.plot
。 在使用map
之后,可以更容易地调用,例如g.set_axis_labels("Date", "Stat")
,这将正确地重命名轴。 您可能还想要g.set(xticklabels=dates)
来获得更有意义的刻度。
还有一个更通用的功能, FacetGrid.map_dataframe
。 这里的规则是相似的,但是你传递的函数必须接受一个名为data
的参数中的数据帧输入,而不是采用类似数组的位置输入,它需要与该数据帧中的变量对应的字符串。 在通过构面的每次迭代中,将调用函数,并将输入数据框屏蔽为row
, col
和hue
级别的组合的值。
所以在你的特定情况下,你需要编写一个我们可以调用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.