使用包含重复列名称的.csv文件中的matplotlib进行绘图

时间:2017-06-19 14:29:18

标签: python pandas user-interface matplotlib dataframe

我正在使用组合的ID1和ID2列绘制线条。在.csv文件中,ID1和ID2号码可能会在某个时刻重复出现。当ID2 = 0时,确定数据是否需要是新行的方法是直接跟随的。我希望程序将下面提供的样本数据识别为2个单独的行。

ID1 ID2  x  y
1   2    1  1
1   2    2  2
1   2    3  3
1   2    4  4 
1   0    5  5
...
1   2    1  3
1   2    2  5
1   2    3  7

现在,我的程序会将此数据绘制为相同颜色的连续线。我需要一个不同颜色的新行,但即使ID1和ID2值重复,我也无法弄清楚如何过滤数据以开始新行。该计划需要看到' 0' 0在ID2列中作为开始新行的信号。任何想法都会非常有用。

2 个答案:

答案 0 :(得分:2)

一个选项是找出零的indizes并循环它们以创建单独的DataFrames来绘制。

u = u"""ID1 ID2  x  y
1   2    1  1
1   2    2  2
1   2    3  3
1   2    4  4 
1   0    5  5
1   2    1  3
1   2    2  5
1   2    3  7
1   0    1  3
1   2    2  4
1   2    3  2
1   2    4  1"""

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

df = pd.read_csv(io.StringIO(u), delim_whitespace=True)

fig, ax = plt.subplots()

inx = list(np.where(df["ID2"].values==0)[0]+1)
inx = [0] + inx + [len(df)]
for i in range(len(inx)-1):
    dff = df.iloc[inx[i]:inx[i+1],:]
    dff.plot(x="x", y="y", ax=ax, label="Label {}".format(i))

plt.show()

enter image description here

答案 1 :(得分:1)

您可以采用的方法是cumsumseaborn使用hue进行绘图:

temp_df = df.assign(line_no=df.ID2.eq(0).cumsum()).query('ID2 != 0')

import seaborn as sns
_ = sns.pointplot(x='x',y='y', hue='line_no',data=temp_df)

enter image description here

或使用matplotlib:

fig,ax = plt.subplots()
for i in temp_df.line_no.unique():
    x=temp_df.query('line_no == @i')['x']
    y=temp_df.query('line_no == @i')['y']
    ax.plot(x,y)

enter image description here