2017-11-02 3 views
-1

메인 플롯에서 마우스를 가리킬 때의 현재 X 값에 해당하는 보조 플롯에 데이터를 플롯하려고합니다. 한 플롯을 다른 마우스 위로 움직이는 방법으로 업데이트하는 방법은 무엇입니까?

나는

import math 

import matplotlib.pyplot as plt 
import numpy as np 

fig, ax = plt.subplots(dpi=100, figsize=(5, 5)) 
x = np.arange(0, 6, 0.1) 
plt.plot(x, np.sin(x), 'r') 

fig2, ax2 = plt.subplots(dpi=100, figsize=(5, 5)) 


def plot_ray(angle, y): 
    circle = plt.Circle((0, 0), 1, color='b', fill=False) 
    length = y/math.sin(angle) 
    line = plt.Line2D([0, length * math.cos(angle)], [0, length * math.sin(angle)]) 
    ax2.clear() 
    ax2.set_xlim(-2, 2) 
    ax2.set_ylim(-2, 2) 
    ax2.add_artist(circle) 
    ax2.add_artist(line) 


def mouse_move(event): 
    x = event.xdata 
    y = event.ydata 
    if x is not None and y is not None: 
     angle = x 
     plot_ray(angle, y) 


cid = fig.canvas.mpl_connect('motion_notify_event', mouse_move) 

plt.show(block=True) 

불행하게도, ax2이 unpredicatble 동작 코딩. fig2 창을 클릭하기 전까지 마우스를 가리키면 업데이트되지 않습니다. 또는 pycharm에서 중단 점을 설정하거나 해제 할 때까지 업데이트되지 않습니다.

enter image description here

어떻게 올바른 동작을 코드?

+0

[mcve]를 읽고 이에 맞게 업데이트하십시오. 문제를 재현하는 데 필요한 중요한 부분을 생략하면 다른 사람이 문제를 이해하는 데 도움이되지 않으므로 답변을 얻는 데 도움이되지 않습니다. – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest 내 업데이트를 참조하십시오. – Dims

답변

1

두 번째 그림을 변경 한 후 새로 고치지 않으 셨습니다. 끝에 fig2.canvas.draw_idle()을 추가하십시오. 이 지금은 오히려 비효율적 모든 MOUSE_MOVE 이벤트에 새로운 원과 아티스트를 만들 것이라고

def mouse_move(event): 
    x = event.xdata 
    y = event.ydata 
    if x is not None and y is not None: 
     angle = x 
     plot_ray(angle, y) 
     fig2.canvas.draw_idle() 

참고. 오히려 그 아티스트를 한 번만 만들고 속성을 업데이트하는 것이 좋습니다.

다음은 훨씬 원활하게 실행됩니다.

import matplotlib.pyplot as plt 
import numpy as np 

fig, ax = plt.subplots(dpi=100, figsize=(5, 5)) 
x = np.arange(0, 6, 0.1) 
plt.plot(x, np.sin(x), 'r') 

fig2, ax2 = plt.subplots(dpi=100, figsize=(5, 5)) 

circle = plt.Circle((0, 0), 1, color='b', fill=False) 
ax2.add_artist(circle) 
line, = ax2.plot([],[]) 
ax2.set_xlim(-2, 2) 
ax2.set_ylim(-2, 2) 

def plot_ray(angle, y): 
    length = y/np.sin(angle) 
    line.set_data([0, length * np.cos(angle)], [0, length * np.sin(angle)]) 

def mouse_move(event): 
    x = event.xdata 
    y = event.ydata 
    if x is not None and y is not None: 
     angle = x 
     plot_ray(angle, y) 
     fig2.canvas.draw_idle() 


cid = fig.canvas.mpl_connect('motion_notify_event', mouse_move) 

plt.show(block=True) 
관련 문제