12

私はmatplotlibでipythonを使用しており、この方法で画像を表示しています:

(起動: ipython --pylab)

figure()  
im = zeros([256,256]) #just a stand-in for my real images   
imshow(im)

ここで、カーソルをイメージ上に移動すると、Figure ウィンドウの左下隅にマウスの位置が表示されます。表示される数字は、x = 列番号、y = 行番号です。これは、イメージ指向ではなく、非常にプロット指向です。表示される数字を変更できますか?

  1. 私の最初の選択肢は、x = 行番号 * スカラー、y = 列番号 * スカラーを表示することです
  2. 私の 2 番目の選択肢は、x = 行番号、y = 列番号を表示することです。
  3. 3 番目の選択肢は、マウスの位置の数字をまったく表示しないことです。

これらのことはできますか?この小さなマウスオーバー テスト表示ウィジェットを何と呼べばいいのかさえわかりません。ありがとう!

4

2 に答える 2

9

format_coordに示すように、Axesオブジェクトを再割り当てするだけで、これを軸ごとに非常に簡単に行うことができます。

format_coordは、2 つの引数 (x,y) を取り、文字列を返す任意の関数です (その後、Figure に表示されます)。

表示したくない場合は、次のようにします。

ax.format_coord = lambda x, y: ''

行と列だけが必要な場合(チェックなし)

scale_val = 1
ax.format_coord = lambda x, y: 'r=%d,c=%d' % (scale_val * int(x + .5), 
                                             scale_val * int(y + .5))

作成するすべてのiimageでこれを行いたい場合は、ラッパー関数を定義するだけです。

def imshow(img, scale_val=1, ax=None, *args, **kwargs):
    if ax is None:
         ax = plt.gca()
    im = ax.imshow(img, *args, **kwargs)
    ax.format_coord = lambda x, y: 'r=%d,c=%d' % (scale_val * int(x + .5), 
                                             scale_val * int(y + .5))
    ax.figure.canvas.draw()
    return im

多くのテストがなければ、多かれ少なかれドロップインの代替品になるはずだと思いますplt.imshow

于 2013-01-16T04:55:40.403 に答える
3

はい、できます。しかし、それはあなたが思っているよりも難しいです。

表示されるマウス トラッキング ラベルは、マウス トラッキングに応答して matplotlib.axes.Axes.format_coord を呼び出すことによって生成されます。独自の Axes クラスを作成し (必要な処理を行うために format_coord をオーバーライドします)、matplotlib にデフォルトの代わりにそれを使用するように指示する必要があります。

具体的には:

独自の Axes サブクラスを作成する

from matplotlib.axes import Axes
class MyRectilinearAxes(Axes):
    name = 'MyRectilinearAxes'
    def format_coord(self, x, y):
        # Massage your data here -- good place for scalar multiplication
        if x is None:
            xs = '???'
        else:
            xs = self.format_xdata(x * .5)
        if y is None:
            ys = '???'
        else:
            ys = self.format_ydata(y * .5)
        # Format your label here -- I transposed x and y labels
        return 'x=%s y=%s' % (ys, xs)

Axes サブクラスを登録する

from matplotlib.projections import projection_registry
projection_registry.register(MyRectilinearAxes)

Figure を作成し、カスタム軸を使用して

figure()
subplot(111, projection="MyRectilinearAxes")

前と同じようにデータを描画します

im = zeros([256,256]) #just a stand-in for my real images
imshow(im)
于 2013-01-16T01:46:55.567 に答える