光标下的matplotlib值

我正在使用matplotlib.imshow来获得二维数组的交互式显示。 光标下的x / y坐标显示在窗口的左下angular。 是否也可以获得光标下的数组的值?

你只需要重新分配ax.format_coord 。 从文档中查看这个例子 。

(代码直接从示例中解除)

 """ Show how to modify the coordinate formatter to report the image "z" value of the nearest pixel given x and y """ import numpy as np import matplotlib.pyplot as plt import matplotlib.cm as cm X = 10*np.random.rand(5,3) fig = plt.figure() ax = fig.add_subplot(111) ax.imshow(X, cmap=cm.jet, interpolation='nearest') numrows, numcols = X.shape def format_coord(x, y):  col = int(x+0.5)  row = int(y+0.5)  if col>=0 and col<numcols and row>=0 and row<numrows:    z = X[row,col]    return 'x=%1.4f, y=%1.4f, z=%1.4f'%(x, y, z)  else:    return 'x=%1.4f, y=%1.4f'%(x, y) ax.format_coord = format_coord plt.show() 

我需要一些我可以重复使用的东西,所以我通过一个类来封装解决scheme:

 #!/usr/bin/env python2 # -*- coding: utf-8 -*- import numpy as np class imshow_show_z: def __init__(self, ax, z, x, y): self.ax = ax self.x = x self.y = y self.z = z self.dx = self.x[1] - self.x[0] self.dy = self.y[1] - self.y[0] self.numrows, self.numcols = self.z.shape self.ax.format_coord = self.format_coord def format_coord(self, x, y): col = int(x/self.dx+0.5) row = int(y/self.dy+0.5) #print "Nx, Nf = ", len(self.x), len(self.y), " x, y =", x, y, " dx, dy =", self.dx, self.dy, " col, row =", col, row xyz_str = '' if ((col>=0) and (col<self.numcols) and (row>=0) and (row<self.numrows)): zij = self.z[row,col] #print "zij =", zij, ' |zij| =', abs(zij) if (np.iscomplex(zij)): amp = abs(zij) phs = np.angle(zij) / np.pi if (zij.imag >= 0.0): signz = '+' else: signz = '-' xyz_str = 'x=' + str('%.4g' % x) + ', y=' + str('%.4g' % y) + ',' \ + ' z=(' + str('%.4g' % zij.real) + signz + str('%.4g' % abs(zij.imag)) + 'j)' \ + '=' + str('%.4g' % amp) + r'*exp{' + str('%.4g' % phs) + u' π j})' else: xyz_str = 'x=' + str('%.4g' % x) + ', y=' + str('%.4g' % y) + ', z=' + str('%.4g' % zij) else: xyz_str = 'x=%1.4f, y=%1.4f'%(x, y) return xyz_str def new_imshow(ax, x, y, z, *args, **kwargs): assert(len(x) == z.shape[1]) assert(len(y) == z.shape[0]) dx = x[1] - x[0] dy = y[1] - y[0] if (np.iscomplex(z).any()): zabs = abs(z) else: zabs = z # Use this to center pixel around (x,y) values extent = (x[0]-dx/2.0, x[-1]+dx/2.0, y[0]-dy/2.0, y[-1]+dy/2.0) # Use this to let (x,y) be the lower-left pixel location (upper-left when origin = 'lower' is not used) #extent = (x[0]-dx/2.0, x[-1]+dx/2.0, y[0]-dy/2.0, y[-1]+dy/2.0) im = ax.imshow(zabs, extent = extent, *args, **kwargs) imshow_show_z(ax, z, x, y) ax.set_xlim((x[0], x[-1])) ax.set_ylim((y[0], y[-1])) return im 

用法示例:

 import matplotlib.pyplot as plt import numpy as np x = np.linspace(-5, 10, 100) y = np.linspace(-2.0, 5, 51) xx, yy = np.meshgrid(x, y) Z = np.sin(xx**2 + yy**2) / (xx**2 + yy**2) fig = plt.figure() ax = fig.add_subplot(1,1,1) im = new_imshow(ax, x, y, Z, aspect = 'auto', origin = 'lower', interpolation = 'nearest') ax.set_xlabel('x') ax.set_ylabel('y') plt.show() 

特征:

  • 可以显示浮动和复杂的值。 对于复数,显示了实部+虚部和极坐标。
  • 将基于xy数组为您设置范围。 请注意,matplotlib示例只有在不使用extent关键字时才有效。
  • 像素以(x,y)位置为中心而不是(x,y)位于左下(或上)位置。