我在使用专用色标和basemap 的一些编码方面遇到了问题
levels=[35,45,55,65,75,85,95,105,115]
CB_color_cycle = ['#377eb8', '#ff7f00', '#4daf4a','#f781bf', '#a65628',
'#984ea3','#999999', '#e41a1c', '#dede00']
fig=plt.figure(501)
m=Basemap(projection='merc',llcrnrlat=27,urcrnrlat=47,llcrnrlon=234,urcrnrlon=285,resolution='h')
px,py=N.meshgrid(lon+360,lat,sparse="True")
X,Y=m(px,py)
m.drawcoastlines()
m.drawcountries()
m.drawstates()
m.fillcontinents(color='gray',alpha=0.1,lake_color='aqua')
m.drawcounties()
#plotting contours
cs=m.contourf(lon+360,lat,tempsfc,levels=levels,cmap=CB_color_cycle,latlon=True,extend='both')
cs2=m.contour(lon+360,lat,tempsfc,levels=levels,latlon=True,colors='k',linestyles='solid')
cbar=plt.colorbar(cs)
cbar.add_lines(cs2)
cbar.ax.set_ylabel('Temp F')
plt.suptitle("SFC Temperature June 26,2017 at 19Z")
plt.show()
但是我犯了这个错误,尽管我有Python的经验,但我以前从未处理过这个问题,因为我正在尝试使用一个特殊的色标。
C:UsersstratusAppDataLocalEnthoughtCanopyUserlibsite-packagesmpl_toolkitsbasemap__init__.py:3608: MatplotlibDeprecationWarning: The ishold function was deprecated in version 2.0.
b = ax.ishold()
C:UsersstratusAppDataLocalEnthoughtCanopyUserlibsite-packagesmpl_toolkitsbasemap__init__.py:3675: MatplotlibDeprecationWarning: axes.hold is deprecated.
See the API Changes document (http://matplotlib.org/api/api_changes.html)
for more details.
ax.hold(b)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
C:UsersstratusDocumentsTestforMattsPaper.py in <module>()
36 #plotting contours
37
---> 38 cs=m.contourf(lon+360,lat,tempsfc,levels=levels,cmap=CB_color_cycle,latlon=True,extend='both')
39 cs2=m.contour(lon+360,lat,tempsfc,levels=levels,latlon=True,colors='k',linestyles='solid')
40
C:UsersstratusAppDataLocalEnthoughtCanopyUserlibsite-packagesmpl_toolkitsbasemap__init__.pyc in with_transform(self, x, y, data, *args, **kwargs)
519 # convert lat/lon coords to map projection coords.
520 x, y = self(x,y)
--> 521 return plotfunc(self,x,y,data,*args,**kwargs)
522 return with_transform
523
C:UsersstratusAppDataLocalEnthoughtCanopyUserlibsite-packagesmpl_toolkitsbasemap__init__.pyc in contourf(self, x, y, data, *args, **kwargs)
3671 mask = np.logical_or(ma.getmaskarray(data),xymask)
3672 data = ma.masked_array(data,mask=mask)
-> 3673 CS = ax.contourf(x,y,data,*args,**kwargs)
3674 except:
3675 ax.hold(b)
C:UsersstratusAppDataLocalEnthoughtCanopyUserlibsite-packagesmatplotlib__init__.pyc in inner(ax, *args, **kwargs)
1890 warnings.warn(msg % (label_namer, func.__name__),
1891 RuntimeWarning, stacklevel=2)
-> 1892 return func(ax, *args, **kwargs)
1893 pre_doc = inner.__doc__
1894 if pre_doc is None:
C:UsersstratusAppDataLocalEnthoughtCanopyUserlibsite-packagesmatplotlibaxes_axes.pyc in contourf(self, *args, **kwargs)
5827 self.cla()
5828 kwargs['filled'] = True
-> 5829 contours = mcontour.QuadContourSet(self, *args, **kwargs)
5830 self.autoscale_view()
5831 return contours
C:UsersstratusAppDataLocalEnthoughtCanopyUserlibsite-packagesmatplotlibcontour.pyc in __init__(self, ax, *args, **kwargs)
862 self._transform = kwargs.get('transform', None)
863
--> 864 self._process_args(*args, **kwargs)
865 self._process_levels()
866
C:UsersstratusAppDataLocalEnthoughtCanopyUserlibsite-packagesmatplotlibcontour.pyc in _process_args(self, *args, **kwargs)
1427 self._corner_mask = mpl.rcParams['contour.corner_mask']
1428
-> 1429 x, y, z = self._contour_args(args, kwargs)
1430
1431 _mask = ma.getmask(z)
C:UsersstratusAppDataLocalEnthoughtCanopyUserlibsite-packagesmatplotlibcontour.pyc in _contour_args(self, args, kwargs)
1518 warnings.warn('Log scale: values of z <= 0 have been masked')
1519 self.zmin = float(z.min())
-> 1520 self._contour_level_args(z, args)
1521 return (x, y, z)
1522
C:UsersstratusAppDataLocalEnthoughtCanopyUserlibsite-packagesmatplotlibcontour.pyc in _contour_level_args(self, z, args)
1184 warnings.warn("Contour levels are not increasing")
1185 else:
-> 1186 raise ValueError("Contour levels must be increasing")
1187
1188 def _process_levels(self):
ValueError: Contour levels must be increasing
缩进不是问题,而是CB_color_cycle,因为我正试图帮助一位朋友进行色盲编码。
CB_color_cycle
只是一个颜色列表,因此使用colors
关键字而不是cmap
:
cs = m.contourf(lon+360, lat, tempsfc, levels=levels, colors=CB_color_cycle, latlon=True, extend='both')
以下是关于contourf
文档中的colors
关键字的说明:
colors:颜色字符串或颜色序列,可选级别的颜色,即轮廓线和轮廓区域。
级别的顺序按升序循环。如果序列短于级别数,则会重复该序列。
作为快捷方式,可以使用单色字符串来代替单元素列表,即"红色"而不是"红色",用相同的颜色为所有级别着色。此快捷方式仅适用于颜色字符串,不适用于其他指定颜色的方式。
默认情况下(值None(,将使用cmap指定的颜色映射。
如果你真的想做一些更花哨的事情,包括一个真正的ColorMap
,请参阅ListedColorMap
或LinearSegmentedColormap
的文档(可能还有这个SO答案(,了解将颜色列表转换为正确的ColorMap
的详细信息。