2017-06-23 18 views
0

私はいくつかの異なるパンダデータフレームのデータを使って時系列をプロットすることに興味があります。私は単一の時系列のデータをプロットする方法を知っており、サブプロットの実行方法はわかっていますが、1つのプロットで複数の異なるデータフレームからプロットする方法はありますか?私は以下のコードを持っています。基本的に私がやっているのは、jsonファイルのフォルダをスキャンし、そのjsonファイルをpandaに解析してプロットできるようにすることです。このコードを実行すると、作成された10個のパンダではなく、1個のパンダからプロットされます。私は10枚のパンダが作成されていることを知っています。なぜなら、それらがすべて正しいことを確認するためのプリントステートメントがあるからです。複数のパンダデータフレームのデータを1つのプロットにプロットする

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() 

答えて

2

実際にはまっすぐです。パンダがあなたを混乱させてはいけません。その下にはすべての列が単調な配列です。

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

+0

あなたは私のコードで上記の私の編集を参照してくださいだろうか?私はリストされたすべてのメソッドを試してみましたが、それはパンダのデータフレームの1つだけをプロットしています – K22

+0

ケイト、正直なところあなたのコードはあまり「pythonic」ではなく、最適化されていません。 1つのサイクルで毎回上書きする場合、なぜデータフレームを使用する必要がありますか?それはどんな利点もdictまたは配列を提供せず、実際には遅いです。あるいは、すべての「名前」を1つの大きなデータフレームに列として保存してからプロットすることもできます。だから、短い答え - あなたのループと名前の割り当てで問題が発生する可能性が高いです - 実際には最後のもの、つまり浅いものと深いものの2つです。 – omdv

+1

私はついにそれを手に入れることができました。私のループはどこから外れましたか、今は持っていますが、これを私が使用する必要があるのに効率的です – K22

2

pd.DataFrame.plot方法は、このために、引数があります

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

私のコードで私の編集を見ることができますか?私はリストされたすべてのメソッドを試してみました。パンダのデータフレームのうちの1つだけをプロットします – K22

0

あなたはパンダのプロットを使用している場合は、datafame.plotからの復帰が軸です、その軸に等しい次の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() 
+0

私のコードで上記の私の編集を見ることができますか?私はリストされたすべてのメソッドを試してみました。そして、それはパンダのデータフレームの1つだけをプロットします – K22

関連する問題