2012-04-09 12 views
4

Wenn ich etwas mit contourf plotten, sehe ich am unteren Rand des Diagrammfensters die aktuellen x- und y-Werte unter dem Mauszeiger. Gibt es eine Möglichkeit, auch den z-Wert zu sehen?matplotlib contourf: Z-Wert unter Cursor erhalten

Hier ein Beispiel contourf:

import matplotlib.pyplot as plt 
import numpy as hp 
plt.contourf(np.arange(16).reshape(-1,4)) 

Antwort

2

Die documentation example zeigt, wie Sie z-Wert von Etiketten in Ihrem Grundstück

Script einfügen können: http://matplotlib.sourceforge.net/mpl_examples/pylab_examples/contour_demo.py

Im Grunde ist es

plt.figure() 
CS = plt.contour(X, Y, Z) 
plt.clabel(CS, inline=1, fontsize=10) 
plt.title('Simplest default with labels') 
+0

Dank, das ist nützlich, aber ich war für eine Live-Anzeige der Z-Wert unter dem Cursor zu fragen, die gleiche, wie sie bereits dort für X und Y ist –

+0

können Sie nicht, das ist Teil der wxWidgets-Schnittstelle. Wenn Sie Ihre eigene UI programmieren, könnten Sie die x/y-Koordinaten erhalten, um sie in die x/y-Koordinaten auf der Achse umzuwandeln. Da Sie die Konturen von plt.contour erhalten, kennen Sie ihre Umrisse und können diejenigen erhalten, die sich in oder um diese Koordinaten befinden. – j13r

+0

@AndreaZonca Sind Sie sicher, dass dies die Antwort ist, die Sie noch akzeptieren möchten? [wilywampa] (http://stackoverflow.com/users/752720/wilywampa) 's sehr neue [Lösung] (http://stackoverflow.com/a/42054903/2749397) tut genau das, wonach Sie gefragt haben .. – gboffi

4

Der Text, der die Positio zeigt n des Cursors wird von ax.format_coord generiert. Sie können die Methode überschreiben, um auch einen Z-Wert anzuzeigen. Zum Beispiel

import matplotlib.pyplot as plt 
import numpy as np 
import scipy.interpolate as si 
data = np.arange(16).reshape(-1, 4) 
X, Y = np.mgrid[:data.shape[0], :data.shape[1]] 
cs = plt.contourf(X, Y, data) 


def fmt(x, y): 
    z = np.take(si.interp2d(X, Y, data)(x, y), 0) 
    return 'x={x:.5f} y={y:.5f} z={z:.5f}'.format(x=x, y=y, z=z) 


plt.gca().format_coord = fmt 
plt.show() 
+0

Es funktioniert, aber es ist auch ziemlich lang für große Datensätze aufgrund der Interpolation (in meinem Fall war nicht für 100x100 Grid verwendbar). – levesque

0

Nur eine Variante von wilywampa ‚s Antwort. Wenn Sie bereits ein vorberechnetes Gitter aus interpolierten Konturwerten haben, weil Ihre Daten spärlich sind oder wenn Sie eine riesige Datenmatrix haben, könnte dies für Sie geeignet sein.

import matplotlib.pyplot as plt 
import numpy as np 

resolution = 100 
Z = np.arange(resolution**2).reshape(-1, resolution) 
X, Y = np.mgrid[:Z.shape[0], :Z.shape[1]] 
cs = plt.contourf(X, Y, Z) 

Xflat, Yflat, Zflat = X.flatten(), Y.flatten(), Z.flatten() 
def fmt(x, y): 
    # get closest point with known data 
    dist = np.linalg.norm(np.vstack([Xflat - x, Yflat - y]), axis=0) 
    idx = np.argmin(dist) 
    z = Zflat[idx] 
    return 'x={x:.5f} y={y:.5f} z={z:.5f}'.format(x=x, y=y, z=z) 

plt.colorbar() 
plt.gca().format_coord = fmt 
plt.show() 

Ex:

Example with mouse cursor