Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matplotlib 当使用多个同步子窗口进行缩放或平移时,会减慢imshow_Matplotlib - Fatal编程技术网

Matplotlib 当使用多个同步子窗口进行缩放或平移时,会减慢imshow

Matplotlib 当使用多个同步子窗口进行缩放或平移时,会减慢imshow,matplotlib,Matplotlib,我一次绘制多个图像,共享轴,因为我使用它进行探索。每张图像都是不同日期的相同卫星图像。我正在试验matplotlib在缩放和平移时的缓慢响应,我想询问任何可以加快此过程的提示 我现在做的是: 从多个netcdf文件加载数据 计算所有数据的最大值,以便归一化 使用ImageGrid创建子地块的网格。在生成每个子图时,我删除数组以释放一些内存(每个数组存储在一个列表中,“删除”只是一个list.pop()。请参阅下面的代码 它是15幅图像,单通道,每幅4600x3840像素。我注意到瓶颈不是RA

我一次绘制多个图像,共享轴,因为我使用它进行探索。每张图像都是不同日期的相同卫星图像。我正在试验matplotlib在缩放和平移时的缓慢响应,我想询问任何可以加快此过程的提示

我现在做的是:

  • 从多个netcdf文件加载数据

  • 计算所有数据的最大值,以便归一化

  • 使用ImageGrid创建子地块的网格。在生成每个子图时,我删除数组以释放一些内存(每个数组存储在一个列表中,“删除”只是一个list.pop()。请参阅下面的代码

它是15幅图像,单通道,每幅4600x3840像素。我注意到瓶颈不是RAM(我有8GB),而是处理器。当缩放或平移时,Python在其中一个内核上的使用率达到100%(它是Intel(R)Core(TM)i5-2500 CPU@3.30GHz,4核,64位)

代码是:

import os
import sys

import numpy as np
import netCDF4 as ncdf
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import ImageGrid
from matplotlib.colors import LogNorm

MIN = 0.001 # Hardcoded minimum data value used in normalization

variable = 'conc_chl'
units = r'$mg/m^3$'
data = []
dates = []

# Get a list of only netCDF files
filelist = os.listdir(sys.argv[1])
filelist = [f for f in filelist if os.path.splitext(f)[1] == '.nc']
filelist.sort()
filelist.reverse()

# Load data and extract dates from filenames
for f in filelist:
    dataset = ncdf.Dataset(os.path.join(sys.argv[1],f), 'r')
    data.append(dataset.variables[variable][:])
    dataset.close()
    dates.append((f.split('_')[2][:-3],f.split('_')[1]))

# Get the maximum value of all data. Will be used for normalization
maxc = np.array(data).max()

# Plot the grid of images + dates
fig = plt.figure()
grid = ImageGrid(fig, 111,\
        nrows_ncols = (3, 5),\
        axes_pad = 0.0,\
        share_all=True,\
        aspect = False,\
        cbar_location = "right",\
        cbar_mode = "single",\
        cbar_size = '2.5%',\
        )
for g in grid:
    v = data.pop()
    d = dates.pop()
    im = g.imshow(v, interpolation='none', norm=LogNorm(), vmin=MIN, vmax=maxc)
    g.text(0.01, 0.01, '-'.join(d), transform = g.transAxes) # Date on a corner
cticks = np.logspace(np.log10(MIN), np.log10(maxc), 5)
cbar = grid.cbar_axes[0].colorbar(im)
cbar.ax.set_yticks(cticks)
cbar.ax.set_yticklabels([str(np.round(t, 2)) for t in cticks])
cbar.set_label_text(units)

# Fine-tune figure; make subplots close to each other and hide x ticks for
# all
fig.subplots_adjust(left=0.02, bottom=0.02, right=0.95, top=0.98, hspace=0, wspace=0)
grid.axes_llc.set_yticklabels([], visible=False)
grid.axes_llc.set_xticklabels([], visible=False)

plt.show()

有什么可以改进以提高响应能力的线索吗

似乎设置
interpolation='none'
比将其设置为“最近”(甚至“双线性”)要慢得多。在受支持的后端(例如,任何Agg后端)上,“无”和“最近”的代码路径不同:“最近”传递给Agg的插值例程,而“无”对图像进行未采样的重新缩放(我只是在这里阅读代码注释)

这些不同的方法给出了不同的定性结果;例如,下面的代码片段给出了一个轻微的莫尔图案,当
interpolation='none'
时,它不会出现

导入matplotlib.pyplot作为plt
将numpy作为np导入
img=np.random.uniform(0255,size=(20002000)).astype(np.uint8)
plt.imshow(img,插值=‘最近’)
plt.show()

我认为放大时“无”与“最近”大致相同(图像像素大于屏幕像素),但缩小时(图像像素小于屏幕像素)会给出更高阶的插值结果。我认为延迟来自重新缩放所需的一些额外Matplotlib/Python计算。

是的,更改它确实加快了交互速度!延迟现在只有几毫秒,您可以注意到它不是完全平滑的,但完全可用。我将比较放大时是否出现任何瑕疵/失真。非常感谢。