我正在同时绘制几张图像,共享轴,因为我将它用于探索目的。每个图像在不同日期是相同的卫星图像。我在进行缩放和平移时正在试验matplotlib的缓慢响应,我想请求任何可以加快这个过程的技巧。
我现在正在做的是:
从多个netcdf文件加载数据。
计算所有数据的最大值,以进行标准化。
使用ImageGrid创建子图的网格。在生成每个子图时,我删除数组以释放一些内存(每个数组都存储在一个列表中,“删除”只是一个list.pop())。请参阅以下代码。
这是15个图像,单通道,每个4600x3840像素。我注意到瓶颈不是RAM(我有8 GB),而是处理器。当缩放或平移时,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()
有什么可以改进以使其更具响应性的线索?
答案 0 :(得分:1)
似乎设置interpolation='none'
明显慢于将其设置为'最近'(甚至是'双线性')。在支持的后端(例如任何Agg后端),'none'和'nearest'的代码路径是不同的:'nearest'传递给Agg的插值例程,而'none'传递一个非抽样的图像重新缩放(我只是阅读这里的代码评论)。
这些不同的方法给出了不同的定性结果;例如,下面的代码段会给出一个轻微的莫尔图案,这种图案在interpolation='none'
时不会出现。
import matplotlib.pyplot as plt
import numpy as np
img = np.random.uniform(0, 255, size=(2000, 2000)).astype(np.uint8)
plt.imshow(img, interpolation='nearest')
plt.show()
我认为放大时“无”与“最近”大致相同(图像像素大于屏幕像素),但在缩小时给出高阶插值结果(图像像素)小于屏幕像素)。我认为延迟来自重新缩放所需的一些额外的Matplotlib / Python计算。