我正在使用带有matplotlib的ipython,我以这种方式显示图像:
(启动时:ipython --pylab)
figure()
im = zeros([256,256]) #just a stand-in for my real images
imshow(im)
现在,当我将光标移到图像上时,我看到鼠标的位置显示在图形窗口的左下角。显示的数字是x =列号,y =行号。这是非常以情节为导向而不是以图像为导向。我可以修改显示的数字吗?
我可以做这些事情吗?我甚至不确定将鼠标悬停测试显示小部件称为什么。谢谢!
答案 0 :(得分:8)
您只需在每个轴上完成此操作,只需重新分配format_coord
Axes
对象format_coord
,如examples所示。
ax.format_coord = lambda x, y: ''
是任意函数,它接受2个参数(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))
如果你只想要行和列(没有检查)
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
如果你想在你做的每个 iimage上做这件事,只需定义包装函数
plt.imshow
经过多次测试我认为应该或多或少地替代{{1}}
答案 1 :(得分:3)
是的,你可以。但它比你想象的要难。
您看到的鼠标跟踪标签是通过调用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)
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)