在Seaborn FaceGrid上的Pandas图

2024-05-17 03:18:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Qt应用程序中遇到了一个问题,当我试图使用pandas绘图功能结合Seaborn的FacetGrids将数据帧绘制为带有时间索引的区域图。结果是正确创建了栅格布局,但这些栅格中不显示打印。不过,使用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})

现在,我想做的是画两个方面,每个团队一个。每个方面都应该将“Away”和“Home”列显示为两个独立的时间序列。按照另一个问题(Plotting time series using Seaborn FacetGrid)中的建议,我编写了一个函数,该函数为map_dataframe()传递给它的子集调用pandas plotting函数:

^{pr2}$

但是,当使用这个函数时,结果是相当意外的:FacetGrid被正确地创建和初始化,但是对pandas方法的两个调用没有使用这个网格作为它们的绘图区域,它们出现在其他地方。在

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

<seaborn.axisgrid.FacetGrid at 0x1a25110>

输出屏幕截图:

在我上面链接的帖子中,@mwaskom注意到方法是以这种方式调用的

must draw a plot on the "currently active" matplotlib Axes.

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

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()函数,以便pandas绘图函数生成的轴出现在Seaborn的FacetGrid创建的子图上?在

(熊猫0.16.0版,Seaborn 0.6.0版,ipython 3.2.1,Python 2.7)


Tags: 函数功能绘图mapdataframepandasdfhome
1条回答
网友
1楼 · 发布于 2024-05-17 03:18:16

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)

相关问题 更多 >