Python 地图打印的basemap/proj出现错误

Python 地图打印的basemap/proj出现错误,python,pandas,data-analysis,matplotlib-basemap,proj,Python,Pandas,Data Analysis,Matplotlib Basemap,Proj,我运行了下面的Python代码,这是《数据分析Python》一书中“绘制地图:可视化海地地震危机数据”的一个示例。第242-246页 代码应该创建海地的地图,但我得到一个错误,如下所示: Traceback (most recent call last): File "Haiti.py", line 74, in <module> x, y = m(cat_data.LONGITUDE, cat_data.LATITUDE) File "/usr/local/lib/

我运行了下面的Python代码,这是《数据分析Python》一书中“绘制地图:可视化海地地震危机数据”的一个示例。第242-246页

代码应该创建海地的地图,但我得到一个错误,如下所示:

Traceback (most recent call last):
  File "Haiti.py", line 74, in <module>
    x, y = m(cat_data.LONGITUDE, cat_data.LATITUDE)
  File "/usr/local/lib/python2.7/site-packages/mpl_toolkits/basemap/__init__.py", line 1148, in __call__
    xout,yout = self.projtran(x,y,inverse=inverse)
  File "/usr/local/lib/python2.7/site-packages/mpl_toolkits/basemap/proj.py", line 286, in __call__
    outx,outy = self._proj4(x, y, inverse=inverse)
  File "/usr/local/lib/python2.7/site-packages/mpl_toolkits/basemap/pyproj.py", line 388, in __call__
    _proj.Proj._fwd(self, inx, iny, radians=radians, errcheck=errcheck)
  File "_proj.pyx", line 122, in _proj.Proj._fwd (src/_proj.c:1571)
RuntimeError
回溯(最近一次呼叫最后一次):
文件“Haiti.py”,第74行,在
x、 y=m(cat_数据。经度,cat_数据。纬度)
文件“/usr/local/lib/python2.7/site packages/mpl_工具包/basemap/__init__uuuuu.py”,第1148行,在_u调用中__
xout,yout=self.projtran(x,y,inverse=inverse)
文件“/usr/local/lib/python2.7/site packages/mpl_toolkits/basemap/proj.py”,第286行,在调用中__
outx,outy=self.\u proj4(x,y,inverse=inverse)
文件“/usr/local/lib/python2.7/site packages/mpl_toolkits/basemap/pyproj.py”,第388行,在调用中__
_项目项目前进(自身、inx、iny、弧度=弧度、errcheck=errcheck)
文件“_proj.pyx”,第122行,在_proj.proj._fwd中(src/_proj.c:1571)
访问违例
我检查了我的机器上是否安装了mpl\u工具包。basemapproj模块。Basemap是从源代码安装的,proj是由自制软件安装的,我觉得它们很好

如果已安装basemap和proj,则此代码是否成功运行?如果不是,您认为这是模块安装问题、代码本身还是其他问题

海地.csv文件可从

将熊猫作为pd导入
将numpy作为np导入
从导入数据帧
data=pd.read\u csv('Haiti.csv')
数据=数据[(数据纬度>18)和(数据纬度<20)&
(data.LONGITUDE>-75)和(data.LONGITUDE<-70)
&data.CATEGORY.notnull()]
def至目录(catstr):
stripped=(catstr.split(',')中x的x.strip()
返回[x为x,如果x为x]
def get_所有类别(cat_系列):
cat_集合=(cat_系列中x的集合(至_cat_列表(x)))
返回排序(集合并集(*类别集合))
def get_英语(cat):
代码,名称=类别拆分('.'))
如果名称中有“|”:
名称=名称。拆分(“|”)[1]
返回代码,name.strip()
所有猫=获取所有类别(data.CATEGORY)
english\u mapping=dict(在所有猫中为x获取英语(x))
def get_代码(序号):
返回[x.split('.')[0]用于序列中的x,如果x]
所有密码=获取密码(所有密码)
代码索引=局部索引(np.唯一(所有代码))
虚拟帧=数据帧(np.0((len(数据),len(代码索引)),
索引=数据。索引,列=代码(索引)
对于行,zip中的cat(data.index,data.CATEGORY):
代码=获取代码(至目录(目录))
虚拟帧ix[行,代码]=1
data=data.join(虚拟帧。添加前缀('category'))
从mpl_toolkits.basemap导入basemap
将matplotlib.pyplot作为plt导入
def基本地图(ax=None,lllat=17.25,urlat=20.25,lllon=-75,urlon=-71):
#创建极轴赤平摄影底图实例。
m=底图(ax=ax,投影=stere',
lon_0=(urlon+lllon)/2,
纬度0=(urlat+lllat)/2,
llcrnrlat=lllat,urcrnrlat=urlat,
llcrnrlon=lllon,urcrnrlon=urlon,
决议草案(f)
#绘制海岸线、州和国家边界、地图边缘。m、 海岸线
m、 各国()
m、 提款国()
返回m
图,轴=plt.子批次(nrows=2,ncols=2,figsize=(12,10))
图子批次调整(hspace=0.05,wspace=0.05)
to_plot=['2a','1','3c','7a']
lllat=17.25;urlat=20.25;lllon=-75;urlon=-71
对于代码,ax在zip中(到u图,轴为平面):
m=基本地图(ax,lllat=lllat,urlat=urlat,
lllon=lllon,urlon=urlon)
cat_数据=数据[数据['category_uu%s'%code]==1]
#计算地图项目坐标。
打印cat_数据。经度,cat_数据。纬度
x、 y=m(cat_数据。经度,cat_数据。纬度)
m、 曲线图(x,y,'k',alpha=0.5)
ax.set_title(“%s:%s%”(代码,英语映射[code]))

这可以通过将m(cat_data.LONGITUDE,cat_data.LATITUDE)更改为m(cat_data.LONGITUDE.values,cat_data.LATITUDE.values)来解决,这要归功于

通过对mine的进一步研究,pandas改变了DataFrame(源自NDFrame)的系列数据应与.value一起传递给Cython函数,如basemap/proj,自2013年12月31日发布v0.13.0以来,如下所示

引自《大熊猫》杂志:

+.. warning::
 +
 +   In 0.13.0 since ``Series`` has internaly been refactored to no longer sub-class ``ndarray``
 +   but instead subclass ``NDFrame``, you can **not pass** a ``Series`` directly as a ``ndarray`` typed parameter
 +   to a cython function. Instead pass the actual ``ndarray`` using the ``.values`` attribute of the Series.
 +
 +   Prior to 0.13.0
 +
 +   .. code-block:: python
 +
 +        apply_integrate_f(df['a'], df['b'], df['N'])
 +
 +   Use ``.values`` to get the underlying ``ndarray``
 +
 +   .. code-block:: python
 +
 +        apply_integrate_f(df['a'].values, df['b'].values, df['N'].values)
您可以找到示例代码的更正版本

+.. warning::
 +
 +   In 0.13.0 since ``Series`` has internaly been refactored to no longer sub-class ``ndarray``
 +   but instead subclass ``NDFrame``, you can **not pass** a ``Series`` directly as a ``ndarray`` typed parameter
 +   to a cython function. Instead pass the actual ``ndarray`` using the ``.values`` attribute of the Series.
 +
 +   Prior to 0.13.0
 +
 +   .. code-block:: python
 +
 +        apply_integrate_f(df['a'], df['b'], df['N'])
 +
 +   Use ``.values`` to get the underlying ``ndarray``
 +
 +   .. code-block:: python
 +
 +        apply_integrate_f(df['a'].values, df['b'].values, df['N'].values)