我有一个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')
然而,这只是给我x轴上的样本编号而不是日期。在这种情况下是否有快速解决方法。
更一般地说,我理解使用FacetGrid
的方法是制作网格,然后map
绘制函数。如果我想推出自己的绘图功能,它需要遵循哪些约定?特别是,我如何编写自己的绘图函数(传递给map
FacetGrid
),该函数接受来自我的数据集的多列数据?
答案 0 :(得分:10)
我会先回答你一般的问题。您可以传递给FacetGrid.map
的函数规则是:
color
和label
。如果你想使用一个hue
变量,那么这些变量应该被传递给底层的绘图函数,虽然你可以抓住**kwargs
并且如果它与特定的情节无关,你就不做任何事情。决策。在某些情况下,您的函数会绘制一个看起来正确的图,而不需要x
,y
,位置输入。我认为这与你使用plt.plot
的方式基本上是一致的。在您使用g.set_axis_labels("Date", "Stat")
后,可以更轻松地调用,例如map
,这将正确地重命名您的轴。您可能还希望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")
它应该有用,我想。