簡體   English   中英

Seaborn FacetGrid 上的熊貓圖

[英]pandas plots on Seaborn FacetGrid

當我嘗試使用 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})

現在,我想要做的是繪制兩個方面,每個團隊一個。 每個方面都應將“離開”和“回家”列顯示為兩個單獨的時間序列。 根據另一個問題( 使用 Seaborn FacetGrid 繪制時間序列)中的建議,我編寫了一個函數,該函數為 map_dataframe() 傳遞給它的子集調用 pandas 繪圖函數:

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 創建的子圖中?

(熊貓版本 0.16.0、Seaborn 版本 0.6.0、ipython 3.2.1、Python 2.7)

mwaskom 的評論讓我走上了正確的軌道:我必須為 plot 函數提供當前軸(現在這看起來很明顯......)。 為了將來參考,這是我的問題的有效解決方案:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM