带有堆叠数据的Python Pandas Subplot

时间:2014-08-03 22:36:05

标签: python matplotlib pandas

我想生成一个pandas数据帧的分组数据的图(或子图)。我认为这应该是基本的 - 我只是缺少一些东西。我有来自下面提供的数据示例准备的输入数据。我想为每个上层数据生成如下图表:

Example plot for upperLevel data A

这里,我有一些示例数据(我粘贴了我在下面使用的示例.csv数据)。这些数据以数据形式,时间,数据的“堆叠”形式出现。数据信息描述特定数据点的类别和子类别。

import pandas as pd
import re
import matplotlib.pyplot as plt

df=pd.read_csv('.....TestData.csv',index_col='T')
df=df.stack(0).reset_index(1)
df.columns=['fullType','data']
#And at this point, this is pretty much the form of my actual data

#So I split it up a bit to try to get columns for different data groupings
regexStr='~'

def upperParser(row):
    label=re.split(regexStr,row['fullType'])
    return label[1]
def lowerParser(row):
    label=re.split(regexStr,row['fullType'])
    return label[2]

df['upperLevel']=df.apply(upperParser,axis=1)
df['lowerLevel']=df.apply(lowerParser,axis=1)
df['time']=df.index


df=df.reset_index(drop=True)

plt.figure();
df.plot();

#And here is one of many attempts... I just seem to be missing something that should be simple:

for grp in df.groupby('upperLevel'):
for key,grp in df.groupby('lowerLevel'):
    plt.plot(x='time',y=grp['data'],label=key)
plt.show()

非常感谢任何方向。我并不担心试图保持任何特定的形式。我的最终目标是绘制所有upperLevel类别的图(比如A =(0,1),B =(0,2))并使用mpl3d查看底层子图(如this,但每个子类别1,2,3作为子图堆叠)。但首先我想的是第一件事。

示例数据:

T   Col~A~1~    Col~A~2~    Col~A~3~    Col~B~1~    Col~B~2~    Col~B~3~
1   1   0.5 0.5 0.5 0.25    0.25
1.5 2   1   1   1   0.5 0.5
2   3   1.5 0.5 1.5 0.75    0.25
2.5 4   2   1   2   1   0.5
3   5   2.5 0.5 2.5 1.25    0.25
3.5 6   3   1   3   1.5 0.5
4   7   3.5 0.5 3.5 1.75    0.25
4.5 8   4   1   4   2   0.5
5   9   4.5 0.5 4.5 2.25    0.25
5.5 10  5   1   5   2.5 0.5
6   11  5.5 0.5 5.5 2.75    0.25
6.5 12  6   1   6   3   0.5
7   13  6.5 0.5 6.5 3.25    0.25
7.5 14  7   1   7   3.5 0.5
8   15  7.5 0.5 7.5 3.75    0.25
8.5 16  8   1   8   4   0.5
9   17  8.5 0.5 8.5 4.25    0.25
9.5 18  9   1   9   4.5 0.5
10  19  9.5 0.5 9.5 4.75    0.25

2 个答案:

答案 0 :(得分:2)

一些提示:

  • df.groupby()会返回(group_name, group)个元组,所以在尝试时要小心 迭代这些小组。
  • 一般情况下,如果pyplot绘图方法涵盖了您想要的地图,则不要手动使用pandas
  • pandas绘图方法通常会为您正在绘制的数据框中的每一列生成一个单独的行,因此,如果您可以重新排列数据以将数据源分成不同的列,则可以轻松获取你想要的情节。
  • pandas绘图方法默认使用数据框的索引作为x轴。

那就是说,你可以用:

制作你想要的地块
for group_name, grp in df.groupby('upperLevel'):
    plot_table = grp.pivot(index='time', columns='lowerLevel', values='data')
    plot_table.plot()

答案 1 :(得分:1)

我同意这是一件有用的事情。我希望Pandas有一个更高级的子图功能,可以按行组和列来制作子图。

这是一个功能,您可以尝试:

def subplotter(df):
    numcols = list(df.select_dtypes(include=['number']).columns)
    objcols = list(df.select_dtypes(include=['object']).columns)
    grouped = df.groupby(objcols)
    l = len(grouped.groups)
    cols = dict({1:1,2:1,3:1,4:2,5:2,6:2}, **{e:3 for e in range(7,25,1)})[l]
    rows = np.ceil(l/(cols*1.0))
    i, fig = 1, plt.figure(figsize=(5*cols,4*rows))
    for name, group in grouped:
        ax = fig.add_subplot(rows, cols, i)
        plt.plot(group[numcols])
        plt.legend(numcols)
        plt.title(', '.join([': '.join(e) for e in zip(objcols, name)]))
        plt.legend(numcols)
        i += 1
    plt.tight_layout()
    return

此函数将按所有对象类型列对DataFrame进行分组,为每个列创建子图。所有数字类型列都放在每个子图中。

我添加的复杂性是确定图形的大小,子图(行和列)的位置以及添加图例和标题。