【问题标题】:matplotlib values under cursor [duplicate]光标下的matplotlib值[重复]
【发布时间】:2013-02-07 15:34:40
【问题描述】:

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

【问题讨论】:

标签: matplotlib


【解决方案1】:

您只需重新分配ax.format_coord。请参阅文档中的this example

(直接从示例中提取的代码)

"""
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()

【讨论】:

    【解决方案2】:

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

    #!/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) 是左下(或上)位置。

    【讨论】:

    • 再读一遍,这个类的使用有点有趣,因为你不保留对它的引用,而是依靠 format_coord 引用来保持对象的活动。你可以通过直接做一个闭包来运行完全相同的东西。
    猜你喜欢
    • 2023-03-22
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多