【问题标题】:Plotting data from multiple pandas data frames in one plot在一个图中绘制来自多个 pandas 数据帧的数据
【发布时间】:2017-06-23 20:29:38
【问题描述】:

我有兴趣使用来自多个不同 pandas 数据帧的数据绘制时间序列。我知道如何为单个时间序列绘制数据,并且我知道如何绘制子图,但是我将如何设法在单个图中从多个不同的数据帧中绘制?我在下面有我的代码。基本上我正在做的是我正在扫描一个 json 文件的文件夹并将该 json 文件解析为熊猫,以便我可以绘图。当我运行此代码时,它仅从其中一只熊猫而不是创建的十只熊猫中绘制。我知道创建了 10 个熊猫,因为我有一个打印声明来确保它们都是正确的。

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

【问题讨论】:

    标签: python pandas plot


    【解决方案1】:

    其实很简单。不要让熊猫迷惑你。在它下面的每一列都是一个 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'])
    

    【讨论】:

    • 你能用我的代码在上面看到我的编辑吗?我已经尝试了所有列出的方法,它只绘制了一个熊猫数据框
    • 凯特,老实说,你上面的代码不是很“pythonic”,看起来也没有优化。如果您在一个循环中每次都覆盖它,为什么需要使用数据框?与 dict 或数组相比,它没有任何好处,实际上速度更慢。或者,您可以将每个“名称”保存为一个大数据框中的一列,然后绘制它。所以,简短的回答 - 问题很可能与您的循环和名称分配有关 - 您可能认为您指的是不同的“名称”,而实际上它是最后一个,即浅拷贝与深拷贝。
    • 我终于拿到了。我的循环在哪里关闭,但现在我有了它,它对于我需要使用它的东西很有效
    【解决方案2】:

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

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

    【讨论】:

    • 你能用我的代码在上面看到我的编辑吗?我已经尝试了所有列出的方法,它只绘制了一个熊猫数据框
    【解决方案3】:

    如果您使用的是 pandas plot,则 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)
    

    输出:

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

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

    【讨论】:

    • 你能用我的代码在上面看到我的编辑吗?我已经尝试了所有列出的方法,它只绘制了一个熊猫数据框
    • 是否只有两个Dataframes具有相同的维度?
    • @RogérioOliveira 不,如果数据框的维度不同,这仍然有效。
    • 我不知道@ScottBoston。确实,我是pythonland的新手。目前,我有一个类似于 JSON 对象的东西,其中填充了我的数据: df = [{'x': [], 'y':[]}, {'x': [], 'y':[]}, {'x': [], 'y':[]}] 最后,我可以按以下方式一一绘制上面的对象: DataFrame(df[0]).plot(x='x' , y='y', kind='line') DataFrame(df[1]).plot(x='x', y='y', kind='line') 等等...它工作正常使用子图时,但我不知道重叠。你能给我一些建议吗?我应该从哪里开始获得如图所示的效果?非常感谢。
    • @RogérioOliveira 使用此信息示例数据和预期输出发布一个新问题。这是一个好的开始。我相信 SO 社区会提供帮助。
    【解决方案4】:

    相信我。 @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'])
    

    【讨论】:

      猜你喜欢
      • 2019-05-29
      • 2019-07-10
      • 1970-01-01
      • 2019-06-29
      • 2018-01-10
      • 1970-01-01
      • 2022-01-06
      • 2016-07-05
      • 2013-12-31
      相关资源
      最近更新 更多