В окне фигуры 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 = номер столбца
- Мой третий выбор - не отображать числа для местоположения мыши вообще
Можно ли сделать что-нибудь из этого? Я даже не уверен, что назвать этим маленьким виджетами для проверки мыши. Спасибо!
Ответы
Ответ 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)