在一个图中绘制来自多个pandas数据帧的数据

时间:2017-06-23 20:29:39

标签: python pandas plot

我有兴趣用几个不同的pandas数据框中的数据绘制时间序列。我知道如何绘制单个时间序列的数据,我知道如何进行子图,但我如何设法在单个图中绘制几个不同的数据框?我的代码如下。基本上我正在做的是我正在扫描json文件的文件夹并将该json文件解析为熊猫,以便我可以进行绘图。当我运行这段代码时,它只是从一只熊猫而不是创建的十只熊猫中绘制出来的。我知道创建了10只熊猫,因为我有一个print语句以确保它们都是正确的。

import sys, re
import numpy as np
import smtplib
import matplotlib.pyplot as plt
from random import randint
import csv
import pylab as pl
import math
import pandas as pd
from pandas.tools.plotting import scatter_matrix
import argparse
import matplotlib.patches as mpatches
import os
import json



parser = argparse.ArgumentParser()
parser.add_argument('-file', '--f', help = 'folder where JSON files are stored')
if len(sys.argv) == 1:
    parser.print_help()
    sys.exit(1)
args = parser.parse_args()


dat = {}
i = 0

direc = args.f
directory = os.fsencode(direc)

fig1 = plt.figure()
ax1 = fig1.add_subplot(111)

for files in os.listdir(direc):
    filename = os.fsdecode(files)
    if filename.endswith(".json"):
        path = '/Users/Katie/Desktop/Work/' + args.f + "/" +filename
        with open(path, 'r') as data_file:
            data = json.load(data_file)
            for r in data["commits"]:
                dat[i] = (r["author_name"], r["num_deletions"], r["num_insertions"], r["num_lines_changed"],
                          r["num_files_changed"], r["author_date"])
                name = "df" + str(i).zfill(2)
                i = i + 1
                name = pd.DataFrame.from_dict(dat, orient='index').reset_index()
                name.columns = ["index", "author_name", "num_deletions",
                                          "num_insertions", "num_lines_changed",
                                          "num_files_changed",  "author_date"]
                del name['index']
                name['author_date'] = name['author_date'].astype(int)
                name['author_date'] =  pd.to_datetime(name['author_date'], unit='s')
                ax1.plot(name['author_date'], name['num_lines_changed'], '*',c=np.random.rand(3,))
                print(name)
                continue

    else:
        continue
plt.xticks(rotation='35')
plt.title('Number of Lines Changed vs. Author Date')
plt.show()

4 个答案:

答案 0 :(得分:3)

实际上很简单。不要让大熊猫迷惑你。在它下面,每一列都只是一个numpy数组。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df1 = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))
df2 = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))

fig1 = plt.figure()
ax1 = fig1.add_subplot(111)

ax1.plot(df1['A'])
ax1.plot(df2['B'])

enter image description here

答案 1 :(得分:2)

pd.DataFrame.plot方法有一个参数 ax

fig = plt.figure()
ax = plt.subplot(111)
df1['Col1'].plot(ax=ax)
df2['Col2'].plot(ax=ax)

答案 2 :(得分:1)

如果您正在使用pandas plot,则datafame.plot的返回值为axis,因此您可以指定下一个dataframe.plot等于该轴。

df1 = pd.DataFrame({'Frame 1':pd.np.arange(5)*2},index=pd.np.arange(5))

df2 = pd.DataFrame({'Frame 2':pd.np.arange(5)*.5},index=pd.np.arange(5))

ax = df1.plot(label='df1')
df2.plot(ax=ax)

输出: enter image description here

或者,如果您的数据框具有相同的索引,则可以使用pd.concat

pd.concat([df1,df2],axis=1).plot()

答案 3 :(得分:0)

相信我。 @omdv的答案是我到目前为止找到的唯一解决方案。当您将 ax 传递给Pandas数据框 plot 函数时,它根本不显示绘图。

df_hdf = pd.read_csv(f_hd, header=None,names=['degree', 'rank', 'hits'],
            dtype={'degree': np.int32, 'rank': np.float32, 'hits': np.float32})
df_hdf_pt = pd.read_csv(pt_f_hd, header=None,names=['degree', 'rank', 'hits'],
            dtype={'degree': np.int32, 'rank': np.float32, 'hits': np.float32})
ax = plt.subplot()
ax.plot(df_hdf_pt['hits'])
ax.plot(df_hdf['hits'])

enter image description here