Python 2.7 用Python绘制高程

Python 2.7 用Python绘制高程,python-2.7,matplotlib,cartopy,python-iris,Python 2.7,Matplotlib,Cartopy,Python Iris,我正试图绘制一张显示高度的马拉维地图。像这样,但当然是马拉维: 我从这里下载了一些高程数据: 这是我创建多维数据集后的数据打印: meters, from 5-min data / (unknown) (time: 1; latitude: 360; longitude: 720) Dimension coordinates: time x - -

我正试图绘制一张显示高度的马拉维地图。像这样,但当然是马拉维:

我从这里下载了一些高程数据:

这是我创建多维数据集后的数据打印:

meters, from 5-min data / (unknown) (time: 1; latitude: 360; longitude: 720)
     Dimension coordinates:
          time                           x            -               -
          latitude                       -            x               -
          longitude                      -            -               x
     Attributes:
          history: 
Elevations calculated from the TBASE 5-minute
latitude-longitude resolution...
          invalid_units: meters, from 5-min data
我开始导入数据,形成一个立方体,删除额外的变量(时间和历史),并将数据限制在马拉维的纬度和经度

import matplotlib.pyplot as plt
import matplotlib.cm as mpl_cm
import numpy as np
import iris
import cartopy
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
import iris.analysis.cartography


def main():

    #bring in altitude data
    Elev = '/exports/csce/datastore/geos/users/s0899345/Climate_Modelling/Actual_Data/elev.0.5-deg.nc'

    Elev= iris.load_cube(Elev)

    #remove variable for time
    del Elev.attributes['history']
    Elev = Elev.collapsed('time', iris.analysis.MEAN)

    Malawi = iris.Constraint(longitude=lambda v: 32.0 <= v <= 36., latitude=lambda v: -17. <= v <= -8.)      
    Elev = Elev.extract(Malawi)

    print 'Elevation'
    print Elev.data
    print 'latitude'
    print Elev.coord('latitude')
    print 'longitude'
    print Elev.coord('longitude')
然而,当我试图绘制它,它不工作。。。这就是我所做的:

#plot map with physical features 
ax = plt.axes(projection=cartopy.crs.PlateCarree())
ax.add_feature(cartopy.feature.COASTLINE)   
ax.add_feature(cartopy.feature.BORDERS)
ax.add_feature(cartopy.feature.LAKES, alpha=0.5)
ax.add_feature(cartopy.feature.RIVERS)
#plot altitude data
plot=ax.plot(Elev, cmap=mpl_cm.get_cmap('YlGn'), levels=np.arange(0,2000,150), extend='both') 
#add colour bar index and a label
plt.colorbar(plot, label='meters above sea level')
#set map boundary
ax.set_extent([32., 36., -8, -17]) 
#set axis tick marks
ax.set_xticks([33, 34, 35]) 
ax.set_yticks([-10, -12, -14, -16]) 
lon_formatter = LongitudeFormatter(zero_direction_label=True)
lat_formatter = LatitudeFormatter()
ax.xaxis.set_major_formatter(lon_formatter)
ax.yaxis.set_major_formatter(lat_formatter)
#save the image of the graph and include full legend
plt.savefig('Map_data_boundary', bbox_inches='tight')
plt.show() 
我得到的错误是
“属性错误:未知属性类型cmap”
,下面是整个世界的地图


有什么想法吗?

您可以尝试添加以下内容:

import matplotlib.colors as colors

color = plt.get_cmap('YlGn')  # and change cmap=mpl_cm.get_cmap('YlGn') to  cmap=color 
并尝试更新matplotlib:

pip install --upgrade matplotlib
编辑

color = plt.get_cmap('YlGn')  # and change cmap=mpl_cm.get_cmap('YlGn') to  cmap=color 

您可以尝试添加以下内容:

import matplotlib.colors as colors

color = plt.get_cmap('YlGn')  # and change cmap=mpl_cm.get_cmap('YlGn') to  cmap=color 
并尝试更新matplotlib:

pip install --upgrade matplotlib
编辑

color = plt.get_cmap('YlGn')  # and change cmap=mpl_cm.get_cmap('YlGn') to  cmap=color 

看起来你想要一个等高线图。所以不是

plot = ax.plot(...)
您可能想使用

plot = ax.contourf(...)
很可能您还希望将纬度和经度作为
tourtf
的参数

plot = ax.contourf(longitude, latitude, Elev, ...)

看起来你想要一个等高线图。所以不是

plot = ax.plot(...)
您可能想使用

plot = ax.contourf(...)
很可能您还希望将纬度和经度作为
tourtf
的参数

plot = ax.contourf(longitude, latitude, Elev, ...)

我将准备与您相同的数据,除了删除我将使用的
time
维度,该维度将删除任何长度为1的维度

import iris

elev = iris.load_cube('elev.0.5-deg.nc')
elev = iris.util.squeeze(elev)
malawi = iris.Constraint(longitude=lambda v: 32.0 <= v <= 36.,
                         latitude=lambda v: -17. <= v <= -8.)      
elev = elev.extract(malawi)

但是,
iris
以的形式提供了
maplotlib.pyplot
函数的快捷方式。这将自动设置具有正确投影的轴实例,并将数据从多维数据集传递到
matplotlib.pyplot
。因此,最后两行可以简单地变成:

import iris.plot as iplt
iplt.contourf(elev, cmap=cmap, levels=levels, extend=extend)

还有,它基本上与
iris.plot
相同,只是它会在适当的地方自动添加颜色条和标签:

import iris.quickplot as qplt
qplt.contourf(elev, cmap=cmap, levels=levels, extend=extend)

绘制完成后,您可以获得Axis实例并添加其他项目(我只是复制了您的代码):


我将准备与您相同的数据,除了删除我将使用的
时间
维度,该维度将删除任何长度为1的维度

import iris

elev = iris.load_cube('elev.0.5-deg.nc')
elev = iris.util.squeeze(elev)
malawi = iris.Constraint(longitude=lambda v: 32.0 <= v <= 36.,
                         latitude=lambda v: -17. <= v <= -8.)      
elev = elev.extract(malawi)

但是,
iris
以的形式提供了
maplotlib.pyplot
函数的快捷方式。这将自动设置具有正确投影的轴实例,并将数据从多维数据集传递到
matplotlib.pyplot
。因此,最后两行可以简单地变成:

import iris.plot as iplt
iplt.contourf(elev, cmap=cmap, levels=levels, extend=extend)

还有,它基本上与
iris.plot
相同,只是它会在适当的地方自动添加颜色条和标签:

import iris.quickplot as qplt
qplt.contourf(elev, cmap=cmap, levels=levels, extend=extend)

绘制完成后,您可以获得Axis实例并添加其他项目(我只是复制了您的代码):


谢谢瓦西里,感谢你的帮助,但这不起作用:(没有变化。你可以试着找到一些东西。谢谢瓦西里,我已经在那里看过了,但没有运气。这很奇怪,因为我在不同的数据集上使用了相同的编码,它工作得非常完美。我不需要导入任何特定的内容,cmap也可以理解。我只是无法让它运行此数据……谢谢瓦西里,感谢你的帮助,但这并没有实现。)工作:(没有变化。你可以试着找到一些东西。谢谢瓦西里,我已经在那里看过了,但没有运气。这很奇怪,因为我在不同的数据集上使用了相同的编码,它工作得非常完美。我不需要导入任何特定的内容,cmap也可以理解。我只是无法让它运行此数据……谢谢@ImportanceOfBeingErnest我将其更改为
plot=ax.contourf(高程坐标(‘纬度’),高程坐标(‘经度’),高程数据,cmap=YlGn,levels=np.arange(02000150),extend='both')
但是现在出现了错误:
ValueError:使用序列设置数组元素。
始终提供完整的代码和完整的错误回溯。否则就不可能知道发生了什么。抱歉,我更新了
#绘图高度数据plot=ax.plot(Elev,cmap=mpl\u cm.get\u cmap('YlGn'),levels=np.arange(02000150),extend='both'))
现在阅读此
#绘图高度数据YlGn=plt.get#cmap('YlGn')plot=ax.contourf(Elev.coord('latitude')、Elev.coord('latitude')、Elev.data、cmap=YlGn、levels=np.arange(020000150)、extend='both')
错误:文件“/home/s0899345/datastore/Climate#建模/Python#代码#和#输出图像/Map#边界#高度.py”,第51行,在主绘图中=ax.tourf(Elev.coord('latitude')、Elev.coord('longitude')、Elev.data、cmap=YlGn、levels=np.arange(02000150)、extend='both')文件“/scratch/s0899345/anaconda/lib/python2.7/site packages/cartopy/mpl/geoaxes.py”,第1333行,在tourtf结果=matplotlib.axes.axes.axes.axes.courtf(self、*args、*args、**、“/scratch/s0899345/anaconda/lib/python2.7/site packages/matplotlib/uuu init_uuuuuuuuuuuuuuuuuuuuu.py”,第1819行,在内部返回函数(ax,*args,**kwargs)(cont)文件中“/scratch/s0899345/anaconda/lib/python2.7/site packages/matplotlib/axes/uaxes.py”,第5627行,在轮廓返回函数mcontour.quadcourset(self,*args,**,**/scratch/s0899345/anaconda/lib/python2.7/site packages/matplotlib/contour.py”,第1424行,在init-ContourSet中。uuu init_uuu(self,ax,*args,**kwargs)文件“/scratch/s0899345/anaconda/lib/python2.7/site packages/matplotlib/contour.py”,第863行,在init-self中。u-args(*args,**kwargs)感谢@ImportanceOfBeingErnest,我已将其更改为
plot=ax.tourf(高程坐标('latitude')、高程坐标('longitude')、高程数据、cmap=YlGn、levels=np.arange(02000150)、extend='both')
但是现在出现了错误:
ValueError:使用序列设置数组元素。
始终提供完整的代码和完整的错误回溯。否则就不可能知道发生了什么。抱歉,我更新了
#绘图高度数据plot=ax.plot(Elev,cmap=mpl\u cm.get\u cmap('YlGn'),levels=np.arange(02000150),extend='both'))
现在阅读此
#绘制高度数据YlGn=plt。获取cmap('YlGn')plo