2017-01-04 29 views
0

我对matplotlib非常陌生,所以请在我解释的时候耐心等待。在matplotlib中重绘图最终崩溃python.exe

我正在使用matplotlib绘制其中有一些形状的2D图形。你可以看到下面的代码和输出图:

from random import randint 
import matplotlib.path as path 
import matplotlib.pyplot as plt 
import matplotlib.patches as patches 

from matplotlib.pyplot import plot, ion, show 
import numpy 


box_a_midd_x = 200 
box_a_midd_y = -300 
box_a_width = 100 
box_a_height = 400 
box_a_x = box_a_midd_x - box_a_width/2 
box_a_y = box_a_midd_y - box_a_height/2 
box_a = path.Path([(box_a_x, box_a_y), (box_a_x, box_a_y + box_a_height), (box_a_x + box_a_height, box_a_y + box_a_height), (box_a_x + box_a_height, box_a_y)]) 

box_b_midd_x = 700 
box_b_midd_y = 100 
box_b_width = 200 
box_b_height = 400 
box_b_x = box_b_midd_x - box_b_width/2 
box_b_y = box_b_midd_y - box_b_height/2 
box_b = path.Path([(box_b_x, box_b_y), (box_b_x, box_b_y + box_b_height), (box_b_x + box_b_height, box_b_y + box_b_height), (box_b_x + box_b_height, box_b_y)]) 

box_c_midd_x = 700 
box_c_midd_y = 700 
box_c_width = 200 
box_c_height = 400 
box_c_x = box_c_midd_x - box_c_width/2 
box_c_y = box_c_midd_y - box_c_height/2 
box_c = path.Path([(box_c_x, box_c_y), (box_c_x, box_c_y + box_c_height), (box_c_x + box_c_height, box_c_y + box_c_height), (box_c_x + box_c_height, box_c_y)])  

box_d_midd_x = 700 
box_d_midd_y = 1400 
box_d_width = 200 
box_d_height = 400 
box_d_x = box_d_midd_x - box_d_width/2 
box_d_y = box_d_midd_y - box_d_height/2 
box_d = path.Path([(box_d_x, box_d_y), (box_d_x, box_d_y + box_d_height), (box_d_x + box_d_height, box_d_y + box_d_height), (box_d_x + box_d_height, box_d_y)])  

monitor_box = path.Path([(35, 1677), (11, -213), (652, -220), (500, 1734)]) 

print "A: " + str(box_a) 
print "B: " + str(box_b) 
print "C: " + str(box_c) 
print "D: " + str(box_d) 

#plt.plot([], []) 
#ion() 
fig = plt.figure() 
ax = fig.add_subplot(111) 
patch = patches.PathPatch(monitor_box, facecolor='black', lw=1) 
patch_a = patches.PathPatch(box_a, facecolor='orange', lw=2) 
patch_b = patches.PathPatch(box_b, facecolor='orange', lw=2) 
patch_c = patches.PathPatch(box_c, facecolor='orange', lw=2) 
patch_d = patches.PathPatch(box_d, facecolor='orange', lw=2) 
ax.add_patch(patch) 
ax.add_patch(patch_a) 
ax.add_patch(patch_b) 
ax.add_patch(patch_c) 
ax.add_patch(patch_d) 
ax.set_xlim(-2000,2000) 
ax.set_ylim(-2000,2000) 
plt.gca().invert_yaxis() 
#plt.plot([1], [1], 'ro') 
#plt.draw() 
#plt.show(block=False) 
#plt.show() 
plt.ion() 
xs = [0] 
ys = [0] 
line, = plt.plot([xs[0], ys[0]], 'ro') 
line.set_data(xs, ys) 
plt.show() 
plt.draw() 
plt.pause(0.001) 


def update_line(hl, new_data): 
    hl.set_xdata(numpy.append(hl.get_xdata(), new_data)) 
    hl.set_ydata(numpy.append(hl.get_ydata(), new_data)) 
    plt.draw() 



while(True): 
    app_x = randint(0,2000) 
    app_y = randint(0,2000) 

    isInsideA = box_a.contains_points([(app_x,app_y)]) 
    isInsideB = box_b.contains_points([(app_x,app_y)]) 
    isInsideC = box_c.contains_points([(app_x,app_y)]) 
    isInsideD = box_d.contains_points([(app_x,app_y)]) 
    whichBox = "" 
    if isInsideA: 
     whichBox = "A" 
    elif isInsideB: 
     whichBox = "B" 
    elif isInsideC: 
     whichBox = "C" 
    elif isInsideD: 
     whichBox = "D" 
    else: 
     whichBox = "..." 

    print ("X: " + str(int(app_x)) + "\t Y: " + str(int(app_y)) + " \t" + str(whichBox)) 
    xs[0] = int(app_x) 
    ys[0] = int(app_y) 
    line.set_data(xs, ys) 
    plt.show() 
    plt.draw() 

输出图像看起来像这样(真的没什么奇怪的)。 graph

的问题是,几秒钟后,图崩溃(Not responsing)(30-40秒,这似乎是随机的)。 当图形窗口挂起时,仍然可以看到python代码仍在运行,并且打印了新值,但图形中不再有任何反应。 我不知道在哪里可以继续。 请运行上面的完整小例子,并希望看到该问题。

我在Windows 7机器上运行Python 2.7.8。更具体地说,在Win32上的Python 2.7.8(默认,2014年6月30日,16:03:49)[MSC v.1500 32位(Intel)]。

+0

此线程似乎包含了一些有前途的方法。 http://stackoverflow.com/questions/10944621/dynamically-updating-plot-in-matplotlib – Henning

回答

-1

高清MYFUNC(X): 回报hasattr(X, 'SET_COLOR')

for o in fig.findobj(myfunc): 
    o.set_color('blue') 

import matplotlib.text as text 

for o in fig.findobj(text.Text): 
    o.set_fontstyle('italic') 
0

您创建的每个迭代一个新的阴谋。 更好地利用set_data()并追加到列表x上的y坐标:

plt.ion() 
xs = [random.randint(-1000, 1000)] 
ys = [random.randint(-1000, 1000)] 
line, = plt.plot([xs[0], ys[0]], 'ro') 
for _ in range(1000): 
    xs.append(random.randint(-1000, 1000)) 
    ys.append(random.randint(-1000, 1000)) 
    line.set_data(xs, ys) 
    plt.show() 
    plt.draw() 
    plt.pause(0.001) 
plt.ioff() 
plt.show() 

这是两个将与每一个随机数:

xs = [random.randint(-1000, 1000)] 
ys = [random.randint(-1000, 1000)] 

现在,创建一个情节,使用这些列表:

line, = plt.plot([xs[0], ys[0]], 'ro') 

在循环中,模拟从LeapMotion设备获得的新x和y值并将它们附加到您的坐标:

xs.append(random.randint(-1000, 1000)) 
ys.append(random.randint(-1000, 1000)) 

更新您的剧情与新坐标:

line.set_data(xs, ys) 
+0

我将你的建议合并到我的代码中(区别在于我的代码几乎永远在for循环中,并继续绘制最新点)。 1分钟左右后,图表仍然挂起(不响应)。有任何想法吗? – theAlse

+0

您需要用您的逻辑替换for循环以获取新的x和y值。每次执行'line.set_data(xs,ys)'和**将不同的x和y追加到'xs'和'ys'时,您应该在不同的地方看到点。循环结束后,'plt.ioff()'停止动画。在范围(1000)中增加'for __范围('):'为范围内的_(100000):'为更长的动画。 –

+0

我一次只显示一个点,像这样'self.xs [0] = int(app_x) self.ys [0] = int(app_y) self.line.set_data(self.xs,self。 ys)',仍然会在一段时间后崩溃图形 – theAlse