Seaborn FacetGrid上的pandas绘图

12
当我试图使用pandas绘图函数结合Seaborn的FacetGrids绘制一个带有时间索引的数据框的面积图时,我在Qt应用程序中遇到了问题。虽然网格布局被正确创建,但是这些图表没有出现在网格中。然而,如果使用Seaborn绘图函数,则会按预期工作。
我尝试通过将绘图例程从我的代码的其余部分中隔离出来来弄清楚发生了什么,并且我发现了一个相当意外的行为,如下所示(使用ipython笔记本):
%matplotlib inline

import pandas as pd
import seaborn as sns

df = pd.DataFrame({
        "Home": [76, 64, 38, 78, 63,    45, 32, 46, 13, 40],
        "Away": [55, 67, 70, 56, 59,    69, 72, 24, 45, 21],
        "Team": ["T1"] * 5 +            ["T2"] * 5,
        "Year": ["1991", "1992", "1993", "1994", "1995"] * 2})

现在,我想要做的是绘制两个面板,一个用于每个团队。每个面板都应该将“客场”和“主场”列显示为两个独立的时间序列。按照另一个问题中的建议(使用Seaborn FacetGrid绘制时间序列),我编写了一个函数,该函数调用pandas绘图函数以绘制map_dataframe()传递给它的子集:
def plot_area(data, color):
    data[["Home", "Away"]].index = pd.to_datetime(data["Year"])
    data[["Home", "Away"]].plot(kind="area")

然而,当使用此函数时,结果相当出乎意料:FacetGrid 被正确创建和初始化,但 pandas 方法的两个调用未将其用作绘图区域,它们出现在其他地方。
g = sns.FacetGrid(df, col="Team")
g.map_dataframe(plot_area)

<seaborn.axisgrid.FacetGrid at 0x1a25110>

输出截图:

在我上面链接的帖子中,@mwaskom指出以这种方式调用的方法

必须在“当前活动”的matplotlib Axes上绘制一个图。

也许这就是问题所在?代码本身似乎是正确的,因为使用不同的绘图函数(例如sns.heatmap())时,一切都按预期工作:

def plot_heatmap(data, color):
    sns.heatmap(data[["Home", "Away"]])    

g = sns.FacetGrid(df, col="Team")
g.map_dataframe(plot_heatmap)

<seaborn.axisgrid.FacetGrid at 0x4a6d110>

输出截图:

我的问题可以归结为:如何更改 plot_area() 函数,以便于由 Seaborn 的 FacetGrid 创建的子图中出现 pandas 绘图函数生成的轴?

(pandas 版本 0.16.0,Seaborn 版本 0.6.0,ipython 版本 3.2.1,Python 版本 2.7)


教程中有一个完整的章节介绍这个问题:http://stanford.edu/~mwaskom/software/seaborn/tutorial/axis_grids.html#mapping-custom-functions-onto-the-grid - mwaskom
2
@mwaskom:感谢您的评论 - 我认为我已经仔细阅读了那一部分,但显然我错过了一个至关重要的部分,即您建议如有需要使用plt.gca()函数来设置当前轴。将'ax=plt.gca()'作为我的绘图函数的参数添加解决了我的问题。再次感谢! - Schmuddi
1个回答

5

mwaskom的评论让我找到了正确的方向:我需要将当前轴提供给绘图函数(现在这似乎很明显...)。供以后参考,这是解决我的问题的有效方法:

def plot_area(data, color):
    data.index = pd.to_datetime(data["Year"])
    data[["Home", "Away"]].plot(kind="area", ax=plt.gca())

g = sns.FacetGrid(df, col="Team")
g.map_dataframe(plot_area)

这个答案对我没有用(即使在此时此刻它可能已经过时了)-- 我有同样的问题,在这里详细描述了:https://stackoverflow.com/questions/63849392/seaborn-facetgrid-followed-by-map-dataframe-creates-empty-plots。如果您能看一下,我会非常感激! - R-Peys

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接