Подтвердить что ты не робот

В окне фигуры matplotlib (с imshow), как я могу удалить, скрыть или переопределить отображаемую позицию мыши?

Я использую ipython с matplotlib, и я показываю изображения следующим образом:

(запущен с: ipython --pylab)

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

Теперь, когда я перемещаю курсор над изображением, я вижу местоположение мыши, отображаемое в левом нижнем углу окна фигуры. Отображаемые числа: x = номер столбца, y = номер строки. Это ориентировано скорее на сюжет, а не на изображение. Могу ли я изменить отображаемые номера?

  • Моим первым выбором было бы отобразить x = номер строки * скаляр, y = номер столбца * скаляр
  • Моим вторым выбором было бы отобразить x = номер строки, y = номер столбца
  • Мой третий выбор - не отображать числа для местоположения мыши вообще

Можно ли сделать что-нибудь из этого? Я даже не уверен, что назвать этим маленьким виджетами для проверки мыши. Спасибо!

4b9b3361

Ответ 1

Вы можете сделать это достаточно просто на основе каждой оси, просто повторно назначив format_coord объекта Axes, как показано в examples.

format_coord - любая функция, которая принимает 2 аргумента (x, y) и возвращает строку (которая затем отображается на рисунке.

Если вы хотите, чтобы экран не отображался просто:

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

Ответ 2

Да, вы можете. Но это сложнее, чем вы думаете.

Вы видите метку отслеживания мыши, вызванную вызовами matplotlib.axes.Axes.format_coord в ответ на отслеживание мыши. Вы должны создать свой собственный класс Axes (переопределяя format_coord, чтобы делать то, что вы хотите), а затем инструктируйте matplotlib использовать его вместо стандартного.

В частности:

Создайте собственный подкласс осей

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()
subplot(111, projection="MyRectilinearAxes")

Нарисуйте свои данные как раньше

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