在 Jupyter 笔记本的 matplotib 图中打印光标坐标:平滑的方式

use*_*974 3 python matplotlib jupyter-notebook

我想在 Jupyter 笔记本中使用 matplotlib 显示的图像中显示光标的坐标。

%matplotlib notebook我正在按照这个问题使用魔法。

虽然这为静态图形提供了一个很好的答案,但是当在交互式设置中使用时,在切片过程中不断重绘图形,这会导致大量闪烁和错误(图形有时不显示)。例如,

%matplotlib notebook
from ipywidgets import interact
import matplotlib.pyplot as plt
import numpy as np

vol = np.random.uniform(size=(16, 16, 16))

@interact(z=(0, 15))
def show(z):
    plt.imshow(vol[z])
    plt.show()
Run Code Online (Sandbox Code Playgroud)

如果没有%matplotlib notebook,图形更新时没有任何闪烁,但不显示光标坐标。有了魔法,坐标显示出来了,但是闪烁的让人难以忍受。

有没有办法在这种简单的情况下获得像素坐标而不闪烁?

Imp*_*est 5

问题是使用plt.show(),它将取代数字。相反,您可能想更新 现有的数字。

%matplotlib notebook
from ipywidgets import interact
import matplotlib.pyplot as plt
import numpy as np

vol = np.random.uniform(size=(16, 16, 16))

fig, ax = plt.subplots()
im = ax.imshow(vol[0])

@interact(z=(0, 15))
def show(z):
    im.set_array(vol[z])
    im.set_clim(vol[z].min(), vol[z].max())
    fig.canvas.draw_idle()
Run Code Online (Sandbox Code Playgroud)

请注意,上面提供了与问题中的代码相同的功能,即每个数组都单独标准化。但是,您可能决定仅设置一次颜色标准化,以便所有数组共享相同的颜色限制。

%matplotlib notebook
from ipywidgets import interact
import matplotlib.pyplot as plt
import numpy as np

vol = np.random.uniform(size=(16, 16, 16))

fig, ax = plt.subplots()
im = ax.imshow(vol[0], vmin=vol.min(), vmax=vol.max())
fig.colorbar(im)

@interact(z=(0, 15))
def show(z):
    im.set_array(vol[z])
    fig.canvas.draw_idle()
Run Code Online (Sandbox Code Playgroud)