0

配列全体を表示し、他の2つの軸をマウス座標にリンクする関数を作成することに興味があります(座標(n、m)のピクセル、1つの軸には配列[n、:]が含まれ、もう1つの配列[ :,m])

私はかなりの進歩を遂げましたが、解決できない問題がいくつかあり、助けが必要です!

まず、軸と画像の間に空白があります。なぜそれらが表示されるのかわかりません。2 番目: 図形のサイズを変更するときに、正方形を維持したいのですが、どうすればよいかわかりません。3 番目: Figure 内でマウスを動かすと、追加された 2 つの軸 (ax1 と ax2) を思い通りに更新できません...

3 点目ですが、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()

どうもありがとう!

編集:これは、私が望んでいた結果に最も近いものです。私はアスペクト = 'auto' を維持しました。それ以外の場合、図のサイズが変更されたときに、サブ軸 (ax1、ax2) が主要な斧 (ax) の形状を維持しないためです。 . おそらく、軸にアスペクトを無効にするようなオプションがあるかもしれません(imshowのアスペクトなし= '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