2017-01-04 12 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

그래프가 몇 초 후 (30-40 초, 무작위로 보임) 그래프가 충돌합니다 (Not responsing). 그래프 창이 멈 추면 여전히 파이썬 코드가 실행 중이고 새 값이 인쇄되지만 그래프에서 아무 것도 나타나지 않는 것을 볼 수 있습니다. 어디에서 계속해야할지 모르겠습니다. 위의 전체 최소 예를 실행하면 문제가 잘 보일 것입니다.

저는 Windows 7 컴퓨터에서 Python 2.7.8을 실행하고 있습니다. 더 구체적으로 파이썬 2.7.8 (기본값, 2014 년 6 월 30 일, 16:03:49) [win32에서 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

는 각 반복에 대한 새로운 플롯을 만들 수 있습니다. y를 좌표 x를 낫다 set_data()를 사용하여리스트에 추가 :

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 Device에서 얻은 새로운 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()'는 애니메이션을 멈춘다. 더 긴 애니메이션의 경우 'for _ in range (1000) :'을 'for in range (100000) :'로 늘립니다. –

+0

나는'self.xs [0] = int (app_x) self.ys [0] = int (app_y) self.line.set_data (self.xs, self. ys)', 그래도 그래프가 잠시 후 충돌합니다. – theAlse