首页 > 解决方案 > 在子图中绘制熊猫数据框

问题描述

我有以下 pandas 数据框,并希望n在其中 n = unique labels(l1,l2,.) 的位置水平创建图a1 row(例如,在以下示例中,由于 ,将有两个图l1 and l2)。然后对于这两个图,每个图都将绘制a4为 x 轴a3和 y 轴。例如,ax[0]将包含 的图表a1,其中包含三条线,连接[(1,15)(2,20)],[(1,17)(2,19)],[(1,23)(2,15)]以下数据的点。

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
    d = {'a1': ['l1','l1','l1','l1','l1','l1','l2','l2','l2','l2','l2','l2'],
         'a2': ['a', 'a', 'b','b','c','c','d','d','e','e','f','f'],
         'a3': [15,20,17,19,23,15,22,21,23,23,24,27],
         'a4': [1,2,1,2,1,2,1,2,1,2,1,2]}
    
    df=pd.DataFrame(d)
    df
    a1  a2  a3  a4
    1   a   15  1 
    1   a   20  2
    1   b   17  1
    1   b   19  2
    1   c   23  1
    1   c   15  2
    2   d   22  1
    2   d   21  2
    2   e   23  1
    2   e   23  2
    2   f   24  1
    2   f   27  2

我目前有以下内容:

def graph(dataframe):
    x = dataframe["a4"]
    y = dataframe["a3"]
    ax[0].plot(x,y) #how do I plot and set the title for each group in their respective subplot without the use of for-loop?
    
fig, ax = plt.subplots(1,len(pd.unique(df["a1"])),sharey='row',figsize=(15,2))
df.groupby(["a1"]).apply(graph)

然而,我上面的尝试只在第一个子图上绘制了所有 a3 和 a4(因为我写了ax[0].plot())。我总是可以使用 for 循环来完成所需的任务,但是对于 中的大量唯一组a1,它的计算成本会很高。有没有办法让它成为一条线上的单线ax[0].plot(x,y),它可以在没有 for 循环的情况下完成所需的任务?任何输入表示赞赏。

标签: pythonpandasdataframematplotlibplot

解决方案


在用 pandas 绘制这些数据时,我看不到任何避免 for 循环的方法。我最初的想法是重塑数据框以使其subplots=True正常工作,如下所示:

dfp = df.pivot(columns='a1').swaplevel(axis=1).sort_index(axis=1)
dfp

df_pivoted

但是我看不到如何选择列的第 1 级MultiIndex来进行类似的dfp.plot(x='a4', y='a3', subplots=True)工作。

删除级别 0,然后使用 dfp.droplevel(axis=1, level=0).plot(x='a4', y='a3', subplots=True)raises运行绘图功能ValueError: x must be a label or position。即使这可行,仍然存在将正确点链接在一起的问题。

seaborn 包的创建是为了方便地绘制这种数据集。如果您愿意使用它,这里有一个示例relplot

import pandas as pd    # v 1.1.3
import seaborn as sns  # v 0.11.0

d = {'a1': ['l1','l1','l1','l1','l1','l1','l2','l2','l2','l2','l2','l2'],
     'a2': ['a', 'a', 'b','b','c','c','d','d','e','e','f','f'],
     'a3': [15,20,17,19,23,15,22,21,23,23,24,27],
     'a4': [1,2,1,2,1,2,1,2,1,2,1,2]}
df = pd.DataFrame(d)

sns.relplot(data=df, x='a4', y='a3', col='a1', hue ='a2', kind='line', height=4)

关系图

您可以使用参数自定义颜色palette并使用 调整网格布局col_wrap


推荐阅读