2017-11-02 2 views
-1

Ich wollte Daten in zusätzlichen Plot, die aktuellen X-Wert der Maus Hover in Hauptdiagramm entsprechen entsprechen.Wie wird ein Diagramm aktualisiert, wenn sich die Maus über ein anderes bewegt?

I codiert

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) 

Leider ax2 unpredicatble verhält. Es wird entweder nicht aktualisiert, während ich die Maus schwebe, bis ich auf fig2 Fenster klicke. Oder es wird nicht aktualisiert, bis ich den Haltepunkt in pycharm gesetzt oder freigegeben habe.

enter image description here

Wie das richtige Verhalten codieren?

+0

Bitte lesen Sie [mcve] und aktualisieren Sie Ihre Frage entsprechend. Wenn Sie wichtige Teile weglassen, die notwendig sind, um das Problem zu reproduzieren, helfen Sie anderen nicht, das Problem zu verstehen und helfen Ihnen daher nicht, eine Antwort zu erhalten. – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest siehe mein Update bitte – Dims

Antwort

1

Sie haben vergessen, die zweite Zahl nach dem Ändern zu aktualisieren. Fügen Sie fig2.canvas.draw_idle() am Ende hinzu.

Beachten Sie, dass dies jetzt neue Kreise und Künstler bei jedem mouse_move-Ereignis erstellen würde, was ziemlich ineffizient ist. Sie möchten diese Künstler lieber einmal erstellen und nur ihre Eigenschaften aktualisieren.

Das folgende läuft viel reibungsloser.

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) 
Verwandte Themen