Seaborn FacetGrid上的大熊猫情节

时间:2015-08-20 11:54:22

标签: python pandas matplotlib seaborn

当我尝试使用pandas绘图功能与Seaborn的FacetGrids结合使用时间索引绘制我的数据帧时,我在Qt应用程序中遇到问题。会发生什么是正确创建网格布局,但这些图不会出现在这些网格中。但是,使用Seaborn绘图功能可以正常工作。

我试图通过将绘图例程与其余代码隔离来弄清楚发生了什么,我发现了一个非常意外的行为,如下所示(使用ipython notebook):

%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})

现在,我想要做的是绘制两个方面,每个方面一个方面。每个方面都应将“离开”和“主页”列显示为两个单独的时间序列。根据另一个问题(Plotting time series using Seaborn FacetGrid)中的建议,我编写了一个函数,为map_dataframe()传递给它的子集调用pandas plotting函数:

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轴上绘制一个图。

也许这就是问题所在?这样的代码似乎是正确的,因为使用不同的绘图功能,一切都按预期工作,例如使用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版本0.16.0,Seaborn版本0.6.0,ipython 3.2.1,Python 2.7)

1 个答案:

答案 0 :(得分:1)

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_heatmap)