2016-07-29 55 views
5

问题Python-我应该使用什么色图方案来计算指数级数据?

我有一个情节,我试图让使用网格数据在世界各地降水率的趋势。我可以使情节本身好,但颜色范围给我的问题。我无法弄清楚如何使颜色映射更好地适合我的数据,这似乎是指数级的。 我尝试了一个对数范围,但它不太适合数据的权利。

代码&数据范围

这里是我的8,192数据值看时,为了绘制在一个简单的X-Y线图等。数据点位于x轴上&值位于y轴上。 enter image description here

这里是我的数据看起来像用LogNormal颜色范围绘制的样子。这是太多的薄荷绿色&橙红对我来说。

#Set labels 
lonlabels = ['0','45E','90E','135E','180','135W','90W','45W','0'] 
latlabels = ['90S','60S','30S','Eq.','30N','60N','90N'] 

#Set cmap properties 
norm = colors.LogNorm() #creates logarithmic scale 

#Create basemap 
fig,ax = plt.subplots(figsize=(15.,10.)) 
m = Basemap(projection='cyl',llcrnrlat=-90,urcrnrlat=90,llcrnrlon=0,urcrnrlon=360.,lon_0=180.,resolution='c') 
m.drawcoastlines(linewidth=1) 
m.drawcountries(linewidth=1) 
m.drawparallels(np.arange(-90,90,30.),linewidth=0.3) 
m.drawmeridians(np.arange(-180.,180.,45.),linewidth=0.3) 
meshlon,meshlat = np.meshgrid(lon,lat) 
x,y = m(meshlon,meshlat) 

#Plot variables 
trend = m.pcolormesh(x,y,lintrends[:,:,0],cmap='jet', norm=norm, shading='gouraud') 

#Set plot properties 
#Colorbar 
cbar=m.colorbar(trend, size='8%',location='bottom',pad=0.8) #Set colorbar 
cbar.set_label(label='Linear Trend (mm/day/decade)',size=25) #Set label 
for t in cbar.ax.get_xticklabels(): 
    t.set_fontsize(25) #Set tick label sizes 
#Titles & labels 
fig.suptitle('Linear Trends of Precipitation (CanESM2)',fontsize=40,x=0.51,y=0.965) 
ax.set_title('a) 1979-2014 Minimum Trend',fontsize=35) 
ax.set_xticks(np.arange(0,405,45)) 
ax.set_xticklabels(lonlabels,fontsize=20) 
ax.set_ylabel('Latitude',fontsize=25) 
ax.set_yticks(np.arange(-90,120,30)) 
ax.set_yticklabels(latlabels,fontsize=20) 

enter image description here

这里就是它看起来像一个默认的,不变的色彩范围。 (相同的代码减去标准=标准参数)。

enter image description here

问题

是否有一个数学方案,我可以用它来创建一个颜色表,更好地展示我的数据的范围是多少?或者我需要制作一个自定义范围?

+2

所以如果是你不喜欢的颜色,你可以选择不同的颜色映射。以下是可能的色彩地图列表。 http://matplotlib.org/examples/color/colormaps_reference.html。您可能还想检查'PowerNorm'而不是'LogNorm'是否更适合您要显示的内容。 – cel

+0

这不是颜色本身,而是范围。如果我能在地图上看到更多蓝调,青色和黄色,我会很高兴。 无论如何,我早先在PowerNorm上玩过,它似乎没有工作,但我只是尝试了一遍,并设置vmax = 3后,现在看起来更均匀,尽管有点沉重的深蓝色的所有零值。 (关于这一点,我可以做的不多。)发布这个答案,我会接受它。 – ChristineB

+0

在相关说明上:[请勿使用喷射颜色映射](http://stats.stackexchange.com/questions/223315/why-use-colormap-viridis-over-jet)。由于颜色映射的黄色部分比红色或蓝色部分亮,因此它会引起人们对数组中值的关注,从数据可视化的角度来看,这是最不感兴趣的。有[很多更合适的色彩地图](http://matplotlib.org/users/colormaps.html)这将帮助你的情节看起来更好:)。 – Andreq

回答

0

一个黑客

你可以尝试申请的最大值,即对于上述2的任何值简单地用2

替换它,那么你将有一个单一的颜色(最大),代表2+和其余的颜色将更均匀地分布在您的数据中。

+0

我最终确实这样做了,但是我还需要将我的规范化切换到PowerNorm并使用规模。 – ChristineB