Matplotlib 2.0 log scale masked imshow与1.53非常不同

2024-07-02 13:03:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近从mpl1.53升级到2.0,它破坏了我的一些计划。其中一个特别的问题是使用imshow进行日志规范化,在x和y的日志级别上使用屏蔽数组。我也许可以使用pcolor、pcolormesh或其他,但我的2D数组非常大(比如20000 X 20000或更大),并且pcolor需要30GB以上的RAM来绘制这个图。我附加了2个图片生成使用相同的源代码。一个是用matplotlib 2.0.0运行的,另一个是在卸载mpl2.0.0并安装mpl1.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 1.53得到的结果:

enter image description here

使用matplotlib 2.0.0得到的结果:

enter image description here

有人能帮我弄清楚这两个版本之间发生了什么变化,以及如何让它在2.0中再次运行?在


Tags: importmatplotlibasnppltaxpowerset