matplotlib自动收报机麻烦:MaxNLocator似乎没有正确的属性

时间:2014-02-10 13:16:41

标签: python matplotlib

当我尝试运行示例脚本时 http://matplotlib.org/examples/images_contours_and_fields/pcolormesh_levels.html 在ipython中,我得到了

In [1]: %run cmap.py
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/usr/lib/python2.7/dist-packages/IPython/utils/py3compat.pyc in execfile(fname, *where)
    173             else:
    174                 filename = fname
--> 175             __builtin__.execfile(filename, *where)

/home/qlnr92/Dropbox/bin/cmap.py in <module>()
     11 cmap = plt.get_cmap('PiYG')
     12 
---> 13 levels = MaxNLocator(nbins=15).tick_values(z.min(), z.max())
     14 norm = BoundaryNorm(levels, ncolors=cmap.N, clip=True)
     15 

AttributeError: MaxNLocator instance has no attribute 'tick_values'

In [18]: dir(levels)
Out[18]: 
['DummyAxis',
'MAXTICKS',
'__call__',
'__doc__',
'__init__',
'__module__',
'_integer',
'_nbins',
'_prune',
'_steps',
'_symmetric',
'_trim',
'autoscale',
'axis',
'bin_boundaries',
'create_dummy_axis',
'default_params',
'pan',
'raise_if_exceeds',
'refresh',
'set_axis',
'set_bounds',
'set_data_interval',
'set_params',
'set_view_interval',
'view_limits',
'zoom']

我对matplotlib很新,所以我不确定我哪里出错了。我很确定所有的软件包都没问题,因为如果我注释掉包含levels变量的任何内容(这是tick_values方法的输出所分配的对象)那么这些图很好地出来了。但是,我想知道出了什么问题。

(为了安全起见,这是我在ipython中使用的略微编辑过的脚本--pylab

import matplotlib.pyplot as plt
from matplotlib.colors import BoundaryNorm
from matplotlib.ticker import MaxNLocator
import numpy as np


dx, dy = 0.05, 0.05

y, x = np.mgrid[slice(1, 5 + dy, dy),
                slice(1, 5 + dx, dx)]

z = np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)

z = z[:-1, :-1]
levels = MaxNLocator(nbins=15).tick_values(z.min(), z.max())

cmap = plt.get_cmap('PiYG')
norm = BoundaryNorm(levels, ncolors=cmap.N, clip=True)

plt.subplot(2, 1, 1)
im = plt.pcolormesh(x, y, z, cmap=cmap, norm=norm)
plt.colorbar()
plt.axis([x.min(), x.max(), y.min(), y.max()])
plt.title('pcolormesh with levels')

plt.subplot(2, 1, 2)
plt.contourf(x[:-1, :-1] + dx / 2.,
             y[:-1, :-1] + dy / 2., z, levels=levels,
             cmap=cmap)
plt.colorbar()
plt.title('contourf with levels')

plt.show()

1 个答案:

答案 0 :(得分:0)

似乎我使用的方法已被bin_boundaries方法取代。 tick_values似乎不再存在......

看Locator? MaxNLocator?和其他继承的类文档