2017-05-29 11 views
1

散布図にいくつかのサブプロットを作成し、残りのカテゴリを反復することによって複数のプロットをプロットしようとしていますが、プロットはエラーを投げずに最初の反復のみを表示します。明確にするために、ここではデータが実際にどのように見えるかの例です:ループ内の散布図は最初の反復をプロットするだけです

  a kind state property T 
0 0.905618 I dry prop1 10 
1 0.050311 I wet prop1 20 
2 0.933696 II dry prop1 30 
3 0.114824 III wet prop1 40 
4 0.942719 IV dry prop1 50 
5 0.276627 II wet prop2 10 
6 0.612303 III dry prop2 20 
7 0.803451 IV wet prop2 30 
8 0.257816 II dry prop2 40 
9 0.122468 IV wet prop2 50 

そして、これは私が例を生成する方法である:

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib import gridspec 

kinds = ['I','II','III','IV'] 
states = ['dry','wet'] 
props = ['prop1','prop2'] 
T = [10,20,30,40,50] 
a = np.random.rand(10) 
k = ['I','I','II','III','IV','II','III','IV','II','IV'] 
s = ['dry','wet','dry','wet','dry','wet','dry','wet','dry','wet'] 
p = ['prop1','prop1','prop1','prop1','prop1','prop2','prop2','prop2','prop2','prop2'] 
t = [10,20,30,40,50,10,20,30,40,50] 
df = pd.DataFrame(index=range(10),columns=['a','kind','state','property','T']) 
df['a']=a 
df['kind']=k 
df['state']=s 
df['property']=p 
df['T']=t 
print df 

次に、私は2行2列を生成するつもりです濡れた状態と乾燥した状態でproperty1とproperty2の変動を表示します。だから私は基本的にこのようないくつかの小さなものに私のデータフレームをスライス:これらのサブプロットのそれぞれにおける

first = df[(df['state']=='dry')&(df['property']=='prop1')] 
second = df[(df['state']=='wet')&(df['property']=='prop1')] 
third = df[(df['state']=='dry')&(df['property']=='prop2')] 
fourth = df[(df['state']=='wet')&(df['property']=='prop2')] 
dfs = [first,second,third,fourth] 

、特定の実験室条件を指定して、私はサンプルの異なる種類のTaの値をプロットしたいです。サンプルの種類を区別するために、私はそれらに異なる色とマーカーを割り当てます。

fig = plt.figure(figsize=(8,8.5)) 
gs = gridspec.GridSpec(2,2, hspace=0.4, wspace=0.3) 
colours = ['r','b','g','gold'] 
symbols = ['v','v','^','^'] 
titles=['dry 1','wet 1','dry 2','wet 2'] 
for no, df in enumerate(dfs): 
    ax = fig.add_subplot(gs[no]) 
    for i, r in enumerate(kinds): 
     #print i, r 
     df = df[df['kind']==r] 
     c = colours[i] 
     m = symbols[i] 
     plt.scatter(df['T'],df['a'],c=c,s=50.0, marker=m, edgecolor='k') 

    ax = plt.xlabel('T') 
    ax = plt.xticks(T) 
    ax = plt.ylabel('A') 
    ax = plt.title(titles[no],fontsize=12,alpha=0.75) 
plt.show() 

しかし、結果は赤のみの三角形で種類Iこの場合には、最初の反復をプロット:だからここに私のプロットスクリプトがあります。この最初の項目を反復リストから削除すると、最初の変数(青い三角形のII)だけがプロットされます。

私は間違っていますか? 図はこのように見えますが、それに応じて、それぞれのサブプロットに赤と青と緑と金のマーカーが表示されます。 Just the red

(これは同様に私の実際のデータで発生するので、問題は、私は例を生成する方法であってはならないのでご注意ください。)

+0

このコメントは、コメントとして投稿するのではなく、編集して、編集してください。 –

+1

あなたの問題はこの行にあると思う: 'df = df [df ['kind'] == r]'。それは内側 'for'ループの内側にあります。つまり、外側の' for'ループの元の 'df'が上書きされます。に名前を変更してみてください。 df2 ['a']、c = c、s = 50.0、marker = m、edgecolor = df2 = df [df ['kind'] == r] 'と' plt.scatter(df2 ['T']、 'k') '。 –

答えて

4

あなたの問題は、内部forループ内にあります。 df = df[df['kind']==r]と記述すると、元のdfは、Iにフィルタされたバージョンに置き換えられます。次に、ループの次の反復では、IIのためにフィルタリングします。それ以上のデータは見つかりません。したがって、コードはそれ以外の場合は「正しい」ため、エラーメッセージも表示されません。関連するコードを次のように書き換えると、

for no, df in enumerate(dfs): 
    ax = fig.add_subplot(gs[no]) 
    for i, r in enumerate(kinds): 
     #print i, r 
     df2 = df[df['kind']==r] 
     c = colours[i] 
     m = symbols[i] 
     plt.scatter(df2['T'],df2['a'],c=c,s=50.0, marker=m, edgecolor='k') 

    ax = plt.xlabel('T') 
    ax = plt.xticks(T) 
    ax = plt.ylabel('A') 
    ax = plt.title(titles[no],fontsize=12,alpha=0.75) 

うまくいくはずです。 Python 3.5でテストされています。

関連する問題