2016-12-18 10 views
3

PsychopyとMatplotlibを使用して、画面の左側にランダムな向き(0,360)、サイズ、位置の100個の矩形を表示します。私はオリエンテーションの各象限に固有の色を割り当てています(オリエンテーションは全て<、緑色は90以上、<は180、青色はすべて> 180、<は270、灰色はすべて> 270)。私は、各矩形のどれくらいがそれらの範囲内にあるのかを数え続け、Matplotlibを使ってプロットしています。グラフを保存し、Psychopy Imagestimを使用してグラフを呼び出して、グラフの右側にグラフを表示します。私はこのスクリプトを関数に保存しておき、関数を何度も実行しています。アイデアは、各キーを押すごとに、長方形(左)と新しい付随グラフ(右)の新しい表示が得られます。MatplotlibをPsychopyループに描画する

私の問題は、長方形と矩形の数が正しく表示されているが、グラフが正しく更新されていないことです。たとえば、最初の試行で24のレッドがある場合、赤いバーにこれが表示されます。しかし、次の試行で22のレッドがある場合、グラフの赤い部分は23に減少せず、24にとどまります。基本的に増加します。これはグラフ全体(すべての色)の場合で、各試行ごとに各バーが増加するだけのグラフになります(削減なし)。なぜこれが起こっているのか分かりません。私はそれがMatplotlibに4つの(色の)変数をどのように渡しているかに問題があると仮定しましたが、それぞれの試行の始めに0にリセットされています。このような理由から私は問題を理解することができません。誰もがそれを試してみたい場合

import random 
import psychopy.visual 
import psychopy.event 
import psychopy.core 
import numpy as np 
import matplotlib.pyplot as plt 

win = psychopy.visual.Window(
    size = [1200,550], 
    units = "pix", 
    fullscr=False, 
    color=[-1,-1,-1] 
) 

def one(): 
    win.flip() 
    rect=psychopy.visual.Rect(win=win,units="pix") 

    n_rect=100 

    performance = [] 

    red = 0 
    green = 0 
    blue = 0 
    grey = 0 

    for i_rect in range(n_rect):        
     rect.width = random.uniform(10,100) 
     rect.height = random.uniform(10,100) 
     rect.ori = random.uniform(0,360) 

     rect.pos = [ 
      random.uniform(-300,-10), 
      random.uniform(-300,300) 
     ] 

     if rect.ori < 90: 
      rect.fillColor = (1,-1,-1) 
      red += 1 

     elif rect.ori >90 and rect.ori <180: 
      rect.fillColor = (-1,1,-1) 
      green += 1 

     elif rect.ori > 180 and rect.ori < 270: 
      rect.fillColor = (-1,-1,1) 
      blue += 1 

     else: 
      rect.fillColor = (0,0,0) 
      grey += 1 

     rect.draw() 

    print ("red: %i")%(red) 
    print ("green: %i")%(green) 
    print ("blue: %i")%(blue) 
    print ("grey: %i")%(grey) 

    red_text = psychopy.visual.TextStim(win,text = red, pos = (165,-180)) 
    green_text = psychopy.visual.TextStim(win,text = green,pos = (295,-180)) 
    blue_text = psychopy.visual.TextStim(win,text = blue, pos = (425,-180)) 
    grey_text = psychopy.visual.TextStim(win,text = grey, pos = (555,-180)) 

    color_text_list = [red_text,green_text,blue_text,grey_text] 

    for color in color_text_list: 
     color.draw() 

    # Here I pass the value of my colour variables to Matplotlib for plotting 

    plt.style.use('ggplot') 
    colors = ('red','green','blue','grey') 
    y_pos = np.arange(len(colors)) 
    performance = [red,green,blue,grey] 

    x = plt.bar(y_pos, performance, align='center') 
    x[0].set_color('red') 
    x[1].set_color('green') 
    x[2].set_color('blue') 
    x[3].set_color('grey') 
    plt.xticks(y_pos, colors) 
    plt.ylabel('count') 

    plt.savefig('image.png',dpi=80,transparent=True) 

    img = psychopy.visual.ImageStim(
     win=win, 
     image="image.png", 
     units="pix", 
     pos = (350,50) 
    ) 

    rect.draw() 
    img.draw() 
    win.flip() 

    psychopy.event.waitKeys() 

for i in range(20): 
    one() 

win.close() 

コードは、それ自身の上で実行することができます。コードは比較的シンプルですが、私がMatplotlibを使ったのは初めてのことですが、明らかに何か不足しているかもしれません。

おかげで、 スティーブ

+0

1 -

はあなたのプロットをクリアする様々な方法のより詳細な説明については、この質問を参照してください。 @Andrew Guyは、それぞれの反復でプロットをクリアする必要があるという点でスポットです。 –

答えて

2

私はpsychopyが現在インストールされていないとして、私は確認できないが、私はあなたの問題はあなたが各反復の後、あなたのpyplot数字をクリアしていないことだと思います。

def one(): 
    ... 
    ... 
    performance = [red,green,blue,grey] 
    #Clears the current plot figure, leaves the window open. 
    plt.clf() 
    x = plt.bar(y_pos, performance, align='center') 
    ... 
    ... 

pyplot現在アクティブな数字を追跡し、あなたがそうでなければ、それを伝えるまで(前のデータをクリアすることなく)その数字上に描画し続けます。 plt.figure()に電話して新しい図を開くこともできますが、前の図を閉じてメモリをクリアするようにしてください。 (非常に良い)、再現例えばWhen to use cla(), clf() or close() for clearing a plot in matplotlib?

+0

完璧、ありがとうございます。 – Steve

関連する問題