python - 为 3D 体积绘制 seaborn 热图动画时出错

标签 python matplotlib seaborn heatmap cross-correlation

尝试可视化两个卷之间的互相关性img_3D ,和 mask_3D ,使用 Seaborn 热图 和 Matplotlib 中的 动画 将 3D 互相关结果可视化为 2D 图像的渐进式动画,但我遇到了错误,您能告诉一下吗我如何摆脱这个错误,并正确可视化热图?

提前致谢。

Traceback (most recent call last):
  File "C:\Users\User\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:\Users\User\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\backends\_backend_tk.py", line 259, in resize
    self.draw()
  File "C:\Users\User\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 9, in draw
    super(FigureCanvasTkAgg, self).draw()
  File "C:\Users\User\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\backends\backend_agg.py", line 392, in draw
    else nullcontext()):
  File "C:\Users\User\AppData\Local\Programs\Python\Python37\lib\contextlib.py", line 112, in __enter__
    return next(self.gen)
  File "C:\Users\User\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\backend_bases.py", line 2788, in _wait_cursor_for_draw_cm
    self.set_cursor(self._lastCursor)
  File "C:\Users\User\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\backends\_backend_tk.py", line 544, in set_cursor
    window.configure(cursor=cursord[cursor])
  File "C:\Users\User\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 1485, in configure
    return self._configure('configure', cnf, kw)
  File "C:\Users\User\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 1476, in _configure
    self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
_tkinter.TclError: invalid command name "."

使用的代码是:

# Import Libraries
#====================================
import numpy as np
np.random.seed(0)
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import nibabel as nib
from scipy.signal import correlate

import seaborn as sns
sns.set()
#===================================

img = np.load('img.npy')
act = np.load('act.npy')

# Mode : 'full', 'valid', 'same'

result = correlate(img, act,mode='same')

print(img.shape, act.shape, result.shape)

def updatefig(sl):
    for sl in range(result.shape[2]):
        print(sl,' / ',result.shape[2])
        sns.heatmap(result[...,sl],cbar=False)
        ax.set_title("frame {}".format(sl))
        # Note that using time.sleep does *not* work here!
        plt.pause(0.1)
fig, ax = plt.subplots()

ani = FuncAnimation(fig, updatefig, frames=range(result.shape[2]), interval=5, blit=True)

plt.show()

最佳答案

检查此代码:

import numpy as np
np.random.seed(0)
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from scipy.signal import correlate
import seaborn as sns
sns.set()

img = np.load('img.npy')
act = np.load('act.npy')

result = correlate(img, act, mode = 'same')

def updatefig(sl):
    ax.cla()
    print(sl + 1, ' / ', result.shape[2])
    sns.heatmap(result[..., sl], cbar = False)
    ax.set_title("frame {}".format(sl + 1))
    ax.axis('off')

fig, ax = plt.subplots()
ani = FuncAnimation(fig, updatefig, frames = result.shape[2], interval = 5)

plt.show()

这给了我这个动画(我将下面报告的动画减半,以将文件大小减少到 2 MB 以下,上面的代码重现了所有 40 帧):

enter image description here


编辑

为了向热图添加固定颜色条,请检查以下代码:

import numpy as np
np.random.seed(0)
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from scipy.signal import correlate
import seaborn as sns
sns.set()

img = np.load('img.npy')
act = np.load('act.npy')

result = correlate(img, act, mode = 'same')

def updatefig(sl):
    ax.cla()
    print(sl + 1, ' / ', result.shape[2])
    sns.heatmap(result[..., sl],
                ax = ax,
                cbar = True,
                cbar_ax = cbar_ax,
                vmin = result.min(),
                vmax = result.max())
    ax.set_title("frame {}".format(sl + 1))
    ax.axis('off')

grid_kws = {'width_ratios': (0.9, 0.05), 'wspace': 0.2}
fig, (ax, cbar_ax) = plt.subplots(1, 2, gridspec_kw = grid_kws, figsize = (10, 8))
ani = FuncAnimation(fig, updatefig, frames = result.shape[2], interval = 5)

plt.show()

它产生这个动画(与前一个动画一样剪切):

enter image description here

关于python - 为 3D 体积绘制 seaborn 热图动画时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62396274/

相关文章:

python - 如何使用 Pandas 从 .txt 文件读取原始文本?

Python、Mechanize - 即使在 set_handle_robots 和 add_headers 之后,robots.txt 也不允许请求

python - 在 ManyToManyField 中定义最大关系

python - Seaborn:带有边缘直方图的 kdeplots

python - 使用旋转的 xlabels 在 Seaborn Python 中绘制条形图

python - Matplotlib + Seaborn - 两条线颜色相同?

python - 如何将命令行输入写入 fabfile?

python - 无法将 pandas Series 传递给 pyplot 的 fill_ Between 函数?

python - 在 matlibplot 中填充两个向量之间的区域

python - Seaborn Factorplot的源函数是什么