0

我有兴趣编写一个函数来显示整个数组以及将另外两个轴链接到鼠标坐标(坐标像素(n,m),一个轴将包含数组 [n,:] 和另一个数组 [ :,m])

我已经取得了实质性进展,但有些问题我无法解决,我需要一些帮助!

首先:轴和图像之间有一些空白,我真的不知道它们为什么会出现。第二:当我调整图形大小时,我想保持方形,但我不知道该怎么做。第三:当我在图中移动鼠标时,我无法像我想要的那样更新添加的两个轴(ax1和ax2)......

对于第三点,如果我放 ax1/ax2.cla() 会有一些问题,因为不会有更多的行。fig.canvas.draw_idle() 和 plt.draw() 似乎解决了部分问题,但是当鼠标不移动时 ax1 和 ax2 变为空......

以下是我遇到的主要困难的一个小片段:

import matplotlib.pyplot as plt
import numpy as np

def update(event):
    if event.inaxes:
        a = ax1.get_lines()[0]
        b = ax2.get_lines()[0]
        a.set_xdata(data[:,int(event.ydata)])
        b.set_ydata(data[int(event.xdata),:])

        ax1.draw_artist(a)
        ax2.draw_artist(b)
        fig.canvas.blit(ax1.bbox)
        fig.canvas.blit(ax2.bbox)

data = np.random.rand(200,200)*10000
fig = plt.figure(num = None, figsize=(8, 8), dpi=60)
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
ax.imshow(data, interpolation = "bilinear", origin = "lower", cmap = 'binary',aspect='auto')
ax1 = fig.add_axes([0.9, 0.1, 0.05, 0.8], sharey = ax)
ax2 = fig.add_axes([0.1, 0.05, 0.8, 0.05], sharex = ax)
ax1.set_xlim((0,10000))
ax2.set_ylim((0,10000))
ax1.plot(np.arange(0,200,1)*50, np.arange(0,200,1), animated = True)
ax2.plot(np.arange(0,200,1), np.arange(0,200,1)*50, animated = True)
fig.canvas.mpl_connect("motion_notify_event", update)

plt.show()

非常感谢!

编辑:这是我能得到的最接近我想要的结果。我保留了 aspect = 'auto' 因为否则当调整图形大小时,子轴 (ax1, ax2) 不会保持主轴 (ax) 的形状......所以我更喜欢让 ax 采用 ax1 和 ax2 的大小. 也许它有一个选项可以让轴具有禁用方面的功能(比如 imshow 的 no aspect = 'auto')。

import matplotlib.pyplot as plt
import numpy as np

def update(event):
    if not event.inaxes: return
    a = ax1.get_lines()[0]
    b = ax2.get_lines()[0]
    a.set_xdata(data[:,int(event.xdata)])
    b.set_ydata(data[int(event.ydata),:])
    fig.canvas.draw()

def axis_to_fig(axis):
    def transform(coord):
        return fig.transFigure.inverted().transform(
            axis.transAxes.transform(coord))
    return transform

def add_sub_axes(axis, rect, share):
    fig = axis.figure
    left, bottom, width, height = rect
    trans = axis_to_fig(axis)
    figleft, figbottom = trans((left, bottom))
    figwidth, figheight = trans([width,height]) - trans([0,0])
    if share == "x":
        return fig.add_axes([figleft, figbottom, figwidth, figheight], sharex = axis)
    if share == "y":
        return fig.add_axes([figleft, figbottom, figwidth, figheight], sharey = axis)

data = np.random.rand(200,200)*10000

fig = plt.figure(num = None, figsize=(8, 8), dpi=60)
ax = fig.add_subplot(111)#add_axes([0.1, 0.1, 0.8, 0.8])
ax.imshow(data, interpolation = "bilinear", origin = "lower", cmap = 'binary', aspect='auto')
ax.set_adjustable('box-forced')
ax1 = add_sub_axes(ax, [1.0, 0, 0.1, 1], "y")
ax2 = add_sub_axes(ax, [0, -0.1, 1, 0.1], "x")
ax1.plot(np.arange(0,200,1)*50, np.arange(0,200,1), '-',color = 'red')
ax1.grid(True)
ax2.plot(np.arange(0,200,1), np.arange(0,200,1)*50, '-',color = 'red')
ax2.grid(True)

ax2.set_xlim((0,np.size(data,0)))
ax1.set_ylim((0,np.size(data,1)))

fig.canvas.mpl_connect("motion_notify_event", update)

ax.axis('off')
plt.show()

尽管如此,添加的轴与初始子图的 x/y 轴并不完全匹配,这很可悲......

4

0 回答 0