2017-06-19 14 views
2

ID1とID2の組み合わせの列を使用して線をプロットしています。 .csvファイルでは、ある時点でID1とID2の番号を繰り返すことができます。データが新しい行になる必要があるかどうかを判断する方法は、ID2 = 0のときに直接実行されます。私は、プログラムが2つの別々の行として以下に示すサンプルデータを認識するようにします。重複する列名を含む.csvファイルからmatplotlibをプロットする

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の値が重複している場合でも、データをフィルタリングして新しい行を開始する方法を理解することはできません。プログラムは、新しい行を開始する信号としてID2列の '0'を参照する必要があります。どんなアイデアであれ非常に役に立ちます。あなたがそれを行うことができ

+1

? – WhatsThePoint

答えて

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

一つの方法は、hueでプロットcumsumseabornを使用することです:

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

+0

あなたはポイント(5,5)、つまりID2列の0を持つポイントがありません。 – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest Hrm ... ID = 0は新しい行の "区切り記号"でしたが、プロットしてはいけません。どちらにしても。ありがとう。 –

関連する問題