So wählen Sie einen Punkt in einer Teilzeichnung aus und markieren ihn in benachbarten Teilzeichnungen in matplotlib (Erweiterung auf den Bereich der Punkte)

Ich möchte eine Streudiagramm-Matrix erstellen, die aus einigen Unterdiagrammen besteht. Ich habe meine Daten aus einer TXT-Datei extrahiert und ein Array mit Formen (x, y, z, p1, p2, p3) erstellt. Die ersten drei Spalten des Arrays repräsentieren die x-, y- und z-Koordinaten des Originalbilds, von dem diese Daten stammen, und die letzten drei Spalten (p1, p2, p3) einige andere Parameter. Folglich haben in jeder Zeile des Arrays die Parameter p1, p2, p3 die gleichen Koordinaten (x, y, z). Im Streudiagramm möchte ich in einer ersten Stufe den Parameter p1 gegen die Parameter p2, p3 visualisieren. Für jeden Punkt, den ich auswähle, möchte ich, dass seine (x, y, z) -Parameter aus den ersten drei Spalten meines Arrays mit Anmerkungen versehen werden und der Punkt mit denselben Koordinaten im angrenzenden Untergrund hervorgehoben oder seine Farbe geändert wird.

In meinem Code werden zwei Unterzeichnungen erstellt und im Terminal werden die Werte (p1, p2 oder p3) gedruckt, die durch Auswählen eines Punkts erfasst werden, die jeweiligen Werte desselben Punkts in der benachbarten Unterzeichnung und die Werte (x, y, z ) Parameter dieses Punktes.

Wenn ich einen Punkt in der ersten Nebenzeichnung auswähle, ändert sich außerdem die Farbe des entsprechenden Punkts in der zweiten Nebenzeichnung, aber nicht umgekehrt. Diese Farbänderung ist nur erkennbar, wenn ich die Figur manuell verändere. Wie kann ich Interaktivität für beide Unterzeichnungen hinzufügen, ohne die Abbildung ändern zu müssen, um Änderungen zu bemerken? Welche Art von Modifikationen sollte ich vornehmen, damit diese Interaktivität in einer reduzierten Streudiagramm-Matrix wie in dieser Frage möglich ist? "Gibt es eine Funktion zum Erstellen von Scatterplot-Matrizen in Matplotlib?". Ich bin kein erfahrener Python - Matplotlib - Benutzer, daher wird jede Art von Hilfe geschätzt

import numpy as np
import matplotlib.pyplot as plt
import pylab as pl



def main():


    #load data from file
    data = np.loadtxt(r"data.txt")

    plt.close("all")
    x = data[:, 3]
    y = data[:, 4]
    y1 = data[:, 5]
    fig1 = plt.figure(1)
    #subplot p1 vs p2
    plt.subplot(121)
    subplot1, = plt.plot(x, y, 'bo', picker=3)
    plt.xlabel('p1')
    plt.ylabel('p2')

    #subplot p1 vs p3
    plt.subplot(122)
    subplot2, = plt.plot(x, y1, 'bo', picker=3)
    plt.xlabel('p1')
    plt.ylabel('p3')

    plt.subplots_adjust(left=0.1, right=0.95, wspace=0.3, hspace=0.45)
    #  art.getp(fig1.patch)
    def onpick(event):

        thisevent = event.artist
        valx = thisevent.get_xdata()
        valy = thisevent.get_ydata()
        ind = event.ind

        print 'index', ind
        print 'selected point:', zip(valx[ind], valy[ind])
        print 'point in the adjacent subplot', x[ind], y1[ind]
        print '(x,y,z):', data[:, 0][ind], data[:, 1][ind], data[:, 2][ind]

        for xcord,ycord in zip(valx[ind], valy[ind]):
            plt.annotate("(x,y,z):", xy = (x[ind], y1[ind]), xycoords = ('data' ),
                xytext=(x[ind] - .5, y1[ind]- .5), textcoords='data',
                arrowprops=dict(arrowstyle="->",
                                connectionstyle="arc3"),
                )
            subplot2, = plt.plot(x[ind], y[ind], 'ro', picker=3)
            subplot1  = plt.plot(x[ind], y[ind], 'ro', picker=3)


    fig1.canvas.mpl_connect('pick_event', onpick)

    plt.show()



main()

Abschließend werden Informationen unabhängig von der Teilzeichnung im Terminal gedruckt, wenn ich einen Punkt auswähle. Die Farbe wird jedoch nur in den Punkten des rechten Unterplots geändert, wenn ich einen Punkt im linken Unterplot auswähle und nicht umgekehrt. Darüber hinaus ist die Änderung der Farbe erst spürbar, wenn ich die Figur optimiere (z. B. verschiebe oder verkleinere) und wenn ich einen zweiten Punkt wähle, bleibt der vorherige farbig.

Jede Art von Beitrag wird geschätzt. Danke im Voraus.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage