颜色映射编码



我在使用专用色标和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,请参阅ListedColorMapLinearSegmentedColormap的文档(可能还有这个SO答案(,了解将颜色列表转换为正确的ColorMap的详细信息。

最新更新