나는 매우 신품이기 때문에 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()
출력 수치는 다음과 같습니다 (실제로는 아무 것도 없습니다).
그래프가 몇 초 후 (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)].
이 스레드는 일부 유망한 접근 방식을 포함하는 것으로 보인다. http://stackoverflow.com/questions/10944621/dynamically-updating-plot-in-matplotlib – Henning