从数据框的行生成并保存绘图

时间:2018-04-10 14:03:15

标签: python pandas matplotlib row

Python新手在这里。

我的问题如下。我有这个(80,1002)从.csv文件加载的连续数据的DataFrame。我的目标是遍历此df(80)的每一行并在基本的pyplot.plot上绘制每一行。在这个df中,前两列将用作标题,以便每个图都有它的特定名称(这里是记录的时间和电极的名称)。

我在绘制一行时所做的是:

import matplotlib.pyplot as plt
import pandas as pd
Location = r'/pathtothefile/name.csv'
df=pd.read_csv(Location,sep=';')
time=range(1,1001);

plt.plot(time,df.loc[0, "0":"999"],'g')
plt.axhline(0, color='black',linewidth=0.5)
plt.xlabel('Time (ms)')
plt.ylabel('Power (mV)')
plt.axis([1, 1000, -5, 5])
plt.title(str(df.iloc[0,0]) + str(df.iloc[0,1]))
plt.show()
row.savefig('/pathwheretosave/name.eps',
        format='eps', dpi=1000)

“时间”变量将与行数据一起绘制。从这里开始,我想循环数据帧的行并在一个单独的文件中绘制/保存每一行,但到目前为止:我失败了​​。有关如何做到这一点的任何想法? 理想情况下,我想在要保存的文件名中写下绘图的标题。

2 个答案:

答案 0 :(得分:1)

您需要循环每一行。这可以通过使用itertuple方法实现,如下所示。

示例数据:

sales = [{'values': [1,2,3,4], 'title': 'title 1'},
         {'values': [2,3,5,7], 'title': 'title 2'},
         {'values': [4,5,5,7], 'title': 'title 3'}]
df = pd.DataFrame(sales)

为每行中的值生成一个图表,并在每行中指定标题

for row in df.itertuples():
    plt.plot(row.values,marker='o')
    plt.title(row.title)
    plt.savefig(row.title + '.png')
    plt.clf()

这是3个单独的图(数据框中每行一个)的输出。

答案 1 :(得分:0)

这个怎么样?如果你想让你的x轴使用时间而不是时间戳标签,它会变得更复杂一些,但听起来你每秒都要在你的电极上进行1次测量。

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

# Make a sample DataFrame
ts = datetime.datetime.now()
df = pd.DataFrame({'time': [ts, ts, ts, ts],
              'electrode': [1, 2, 3, 4],
              1: [0.1, 0.1, 0.1, 0.1],
              2: [0.22, 0.2, 0.2, 0.2],
              3: [0.37, 0.3, 0.3, 0.3]}, 
              columns = ['time', 'electrode', 1, 2, 3] )

number_of_measurements = df.shape[1] - 2

for i in range(0, len(df)):
    fig, ax = plt.subplots(figsize=(8, 8))
    df.iloc[i][2:].plot(ax=ax, xticks=range(1, number_of_measurements + 1, 1))
    plot.set_xlabel("Time (ms)")
    plot.set_ylabel("Power (mV)")
    fig.suptitle('{} electrode:{}'.format(df.iloc[i].time, df.iloc[i].electrode))
    fig.savefig('plot{}-{}.png'.format(df.iloc[i].time, df.iloc[i].electrode), bbox_inches='tight')