Python Matplotlib 2.0对数刻度屏蔽imshow与1.53有很大不同

Python Matplotlib 2.0对数刻度屏蔽imshow与1.53有很大不同,python,matplotlib,imshow,Python,Matplotlib,Imshow,我最近从MPL1.53升级到2.0,它打破了我的一些情节。其中一个我无法修复的问题是使用imshow进行日志规范化,在日志范围内对x和y进行屏蔽数组。我可能会使用pcolor、pcolormesh或其他方法,但我的2D阵列非常大(比如20000 X 20000或更大),而且pcolor需要消耗超过30GB的RAM来绘制此图。我附上2张图片生成使用相同的源代码。一个是使用matplotlib 2.0.0运行的,另一个是在卸载MPL 2.0.0并安装MPL 1.53后运行的。有人能帮我弄清楚为什么新

我最近从MPL1.53升级到2.0,它打破了我的一些情节。其中一个我无法修复的问题是使用imshow进行日志规范化,在日志范围内对x和y进行屏蔽数组。我可能会使用pcolor、pcolormesh或其他方法,但我的2D阵列非常大(比如20000 X 20000或更大),而且pcolor需要消耗超过30GB的RAM来绘制此图。我附上2张图片生成使用相同的源代码。一个是使用matplotlib 2.0.0运行的,另一个是在卸载MPL 2.0.0并安装MPL 1.53后运行的。有人能帮我弄清楚为什么新版本不起作用吗

我对问题进行了编辑,以包含一个完整的工作示例,示例数据不会生成带有2.0的空白图,而是一个外观非常不同的图

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

def power_law(x,b):
    return b*(x**0.2)

x=np.logspace(9,16,100)
y=np.logspace(1,3.5,100)
Z=[]
for xi in x:
    zy=[]
    for yi in y:
        if power_law(xi,0.25)<yi and yi <power_law(xi,0.6):
            zy.append(yi*xi)
        else:
            zy.append(np.nan)
    Z.append(zy)
Z=np.array(Z)

Ziv=~np.isnan(Z)
Zval=Z[Ziv]
vmin,vmax=np.amin(Zval),np.amax(Zval)

fig,ax=plt.subplots()
ax.set_xscale('log')
ax.set_yscale('log')
ax.set_ylim(1E9,1E16)
ax.set_ylim(20,2000)

extent=[x[0],x[-1],y[0],y[-1]]
norm=mpl.colors.LogNorm(vmin=vmin,vmax=vmax)
ax.imshow(Z,extent=extent,aspect='auto',origin='lower',cmap='jet',
          vmin=vmin,vmax=vmax,norm=norm)
plt.show()
将matplotlib导入为mpl
将matplotlib.pyplot作为plt导入
将numpy作为np导入
def幂律(x,b):
返回b*(x**0.2)
x=np.对数空间(9,16100)
y=np.对数空间(1,3.5100)
Z=[]
席曦:
zy=[]
对于y中的易:

如果幂律(xi,0.25)见此处。我不知道这对你的绘图有什么影响,因为我没有
Z
。如果省略
范围
和轴限制,会发生什么情况?它仍然不会显示任何内容吗?我无法使用
Z
的一些虚拟数据重现mpl 2.0.0的问题。也许你需要(a)使用一个简单的测试数据集测试你的代码,或者(b)给我们提供一个最小的、完整的例子:看,我用一个MCVE修改了这个问题。谢谢你的关注@汤姆西在这里。我不知道这对你的绘图有什么影响,因为我没有
Z
。如果省略
范围
和轴限制,会发生什么情况?它仍然不会显示任何内容吗?我无法使用
Z
的一些虚拟数据重现mpl 2.0.0的问题。也许你需要(a)使用一个简单的测试数据集测试你的代码,或者(b)给我们提供一个最小的、完整的例子:看,我用一个MCVE修改了这个问题。谢谢你的关注@汤姆