使用Psychopy和Matplotlib我在屏幕的左侧显示100个随机方向(0,360),大小和位置的矩形。我为每个方向的象限分配一种独特的颜色(即所有方向的红色< 90,绿色的ori>> 90和< 180,蓝色的全部> 180和< 270,以及灰色的全部> 270)。我要计算每个矩形中有多少落在这些范围内,然后使用Matplotlib绘制它们。我通过保存图表在屏幕右侧显示该图表,然后使用Psychopy Imagestim重新调用它。我将此脚本保存在一个函数中,然后多次运行该函数。我的想法是,在每个按键上,我得到一个新的矩形显示(左)和一个新的附图(右侧)。
我的问题是,虽然矩形和矩形计数显示正常,但图表未正确更新。例如,如果在第一次试验中有24个红色,则红色条将显示此信息。但是,如果在下一次试验中有22个红色,则图表的红色部分不会减少到23个,它会保持在24个。它基本上只会增加。这是整个图形(所有颜色)的情况,导致图形仅增加每个试验的每个条形(没有减少)。我不明白为什么会这样。我认为这是一个问题,我如何将我的4(颜色)变量传递给Matplotlib,但它们在每次试验开始时被重置为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 :(得分: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?