python – 创建一个白色居中的零色图

我必须承认,了解如何创建或操作matplotlib的色彩图并不是一件容易的事.因此,我正在寻求一些帮助来解释和设置从蓝色(负)到红色(正)的色彩图,并且白色以零为中心.我想在contourf中使用这个cmap:

>这有效,但颜色是相反的

cs = plt.contourf(longrid,latgrid,ar[window-1]-bkgrd,levels,cmap = cm.get_cmap('BuRd',len(levels)-1))

>这里的问题是BuRd_r在零附近带走了白色

cs = plt.contourf(longrid,cmap = cm.get_cmap('BuRd_r',len(levels)-1))

我很感激任何帮助.

这是测试色彩映射的功能和数据:

def PlotAnomalyCF(ar,hgrid,longrid,outfile,units):                        
    window = 1                                                                           
    tsize = 8                                                                            
    plt.close()                                                                          
    plt.figure(figsize=(11.7,4.3) )                                                      
    plt.clf()                                                                            
    plt.cla()                                                                            

    bkgrd = bn.nanmean(ar[:],0)

    for v in hgrid:OA                                                                    
        plt.subplot(1,len(hgrid),window)                                                 
        plt.title(v,fontsize=tsize)                                                      
        plt.subplots_adjust(left=0.07,bottom=0.75,right=0.98,top=0.92,wspace=0.12,hspace=0.98)                                     
        cs = plt.contourf(longrid,cmap=cm.get_cmap('BuRd_r',len(levels)-1))                      
        cs.cmap.set_over('r')                                                            
        plt.grid(True)                                                                   
        plt.axis('off')                                                                  
        window += 1                                                                      
    ax = plt.gca()                                                                       
    pos = ax.get_position()                                                              
    l,b,w,h = pos.bounds                                                                 
    print l,h                                                                        
    cax = plt.axes([l-0.848,b-0.05,0.91,0.02]) # setup colorbar axes                     
    cbar = plt.colorbar(cs,cax=cax,orientation='horizontal')                             
    cl = plt.getp(cbar.ax,'xticklabels')                                                
    plt.setp(cl,fontsize=8)
    # Add units text                                                                     
    plt.figtext(0.012,0.83,units,fontsize=tsize+1)                                       
    print 'outfile.',outfile                                                             
    plt.savefig(outfile,dpi=900,orientation='landscape',format='pdf')                    
    plt.show()

# Data
hgrid = array([-18,-15,-12,-9,-6,-3,3,6,9,12,15,18])
latgrid = array([ 5.61402391,4.91227095,4.21051798,3.508765,2.80701201,2.10525902,1.40350602,0.70175301,0.,-0.70175302,-1.40350604,-2.10525907,-2.8070121,-3.50876514,-4.21051818,-4.91227122,-5.61402427])
longrid = array([-5.625,-4.921875,-4.21875,-3.515625,-2.8125,-2.109375,-1.40625,-0.703125,0.703125,1.40625,2.109375,2.8125,3.515625,4.21875,4.921875,5.625   ])
levels = array([-20,-19,-18,-17,-16,-14,-13,-11,-10,-8,-7,-5,-4,-2,-1,1,2,4,5,7,8,10,11,13,14,16,17,18,19,20])
units ='$\mathrm{CC_{200}\,[\%]}$'
ar = shape is (13,17) with max = 82.4 and min = 45.5. It would be easier to just
     generate some random data within these intervals. Alternatively just copy one of the 
     array:
ar[1] = array([[ 46.91224792,46.21374984,46.86130719,47.01021234,46.72626813,46.2288305,46.43835451,45.79325437,45.58271668,46.35872217,48.08725987,48.44553638,47.76519316,47.6366742,48.40425078,48.77756577,49.33566712],[ 46.83599932,46.84286989,47.33453309,46.55030976,46.80566458,46.53292035,47.02261763,47.41084421,47.38724565,47.91122826,49.21117552,49.45223641,49.97629913,50.44165439,51.08080398,50.79600723,49.968034  ],[ 47.42288313,47.07674124,46.7167639,46.11959218,46.95814111,46.88763807,47.79510368,48.50213272,49.14340301,50.0550682,50.96554707,51.70960776,52.76304827,53.13428506,53.01955687,52.57951586,51.91245273],[ 47.71067291,47.48154219,47.40131211,47.45929857,48.46118424,48.65199823,49.38156691,49.86137507,50.55394084,51.96604309,52.60579898,53.69096203,54.22750101,54.37757099,54.31517398,53.47697773,53.41809044],[ 48.20779565,48.58856851,48.75880829,49.40822878,50.03355014,51.44922083,52.00567831,52.99485667,53.69339127,53.58208129,53.88588998,55.24096208,55.24137628,55.38338399,55.30856415,55.0329081,54.58041914],[ 49.20063728,49.81223264,50.2145489,50.54749112,51.44252761,53.1708726,54.48141824,55.1337493,55.86338227,55.80719304,56.1060897,56.15050406,56.10404113,56.82550383,57.12370494,56.79250814,57.21656741],[ 50.17222332,50.78494993,51.47036476,51.78513471,54.07329312,55.12136894,56.63202678,56.77587861,57.60688855,57.31874243,57.86532727,58.38753463,58.52204736,58.8451274,59.17282185,58.93137673,58.90977463],[ 51.50642331,51.51055372,52.44746806,53.37696513,54.86775802,56.68992167,57.90624404,58.76394172,59.64662899,59.80540837,59.98355254,60.05761821,59.95848562,60.54540623,60.4776266,60.11749116,59.74209418],[ 51.40396463,51.48043239,52.89530187,53.73500868,55.39612502,56.70178532,58.07064267,59.56644298,60.47288049,60.59095081,61.26474813,61.20278944,61.43807574,61.1942828,60.40014922,59.78371327,59.50410992],[ 51.89656984,52.18725649,52.57764233,54.39502415,55.61672911,57.04180061,58.54357871,59.76354498,60.24155861,60.59473182,60.65985503,60.92762915,60.76726905,60.47166256,60.42044548,60.04043031,60.06031171],[ 51.69698671,52.39494994,52.71685017,53.65488505,54.52480831,56.33091376,57.87811829,58.36719736,59.31479758,59.61329074,59.81807224,59.44053305,59.25522337,59.5309563,59.68850776,59.54046914,58.60604327],[ 50.81523448,51.5690217,51.81382216,52.88514118,53.27394887,54.6941369,55.81938471,56.85401174,57.10874072,58.55074569,58.45869901,57.67496274,57.3895956,58.05319653,58.83009123,57.90678384,56.97717781],[ 49.61355365,49.92298625,50.56281781,51.22117266,51.98020374,53.0328832,53.76602714,54.94396421,55.16849545,55.83033544,56.19720112,56.9382048,57.20669361,56.76351885,56.93632305,56.16428665,54.7570241 ],[ 49.17250426,49.14663096,49.86504335,50.24394193,50.84671744,51.21785439,51.72667942,52.8287256,53.65550669,53.81801262,54.62490542,54.88045696,55.27367041,54.89234901,54.51005786,53.57284022,52.53966996],[ 48.55125023,48.99467099,49.80237362,49.67943854,49.45569362,49.3387854,50.129718,49.94784906,51.03357894,51.73021167,52.0211617,52.55805334,52.22956095,51.88844202,50.87410618,50.39506101,49.72117909],[ 48.37551433,48.30812683,48.45300884,48.50818535,47.76798967,47.21965588,47.60764424,48.21327283,48.52370448,49.95221655,49.7608777,50.1178807,50.15020093,49.4369175,49.16839811,49.31254753,48.03208233],[ 46.91675497,46.45280928,46.37122283,46.69881125,45.95493853,46.33296801,46.15091804,46.09862998,46.31676066,46.6199912,47.60040926,48.34096053,47.78005438,48.0951173,48.15291404,47.21140107,46.28884057]])

解决方法

我将不再使用股票cmap,而是完成自己的生产.

正如您已经发现的那样,为了在使用cmaps时绝对控制颜色(不通过颜色数组),cmap中的颜色数应该等于级数 – 1.

我们可以通过以下示例轻松演示这一点.让我们用三种基色制作一个色彩图:

import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import numpy


data = numpy.arange(12).reshape(3,4)

cmap = mcolors.ListedColormap([(0,1),(0,0),(1,0)])

但是,当我们使用3 3级以外的任何其他值时,我们将得到您可能不会期望的结果:

plt.subplot(121)
plt.contourf(data,cmap=cmap,levels=[1,10])

plt.subplot(122)
plt.contourf(data,8])

plt.show()

所以我已经证明你的等级必须是n_colors-1的长度,但是因为我们想要有3种颜色,并且总是显示中间颜色,所以我们还必须具有偶数个等级.

好,现在我们有一些基本规则,让我们创建一个LinearSegmentedColormap,它实际上只是一个ListedColormap,插值为N种颜色:

levs = range(12)
assert len(levs) % 2 == 0,'N levels must be even.'

cmap = mcolors.LinearSegmentedColormap.from_list(name='red_white_blue',colors =[(0,1.,0)],N=len(levs)-1,)
plt.contourf(data,levels=levs)
plt.show()

我们可以通过编程验证normailzed cmap是否为白色作为中间颜色:

>>> print cmap(0.5)
(1.0,1.0,1.0)

希望这将为您提供所需的所有信息,以便您能够制作任何您喜欢的色彩图并在轮廓上成功使用它.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Python中的函数(二) 在上一篇文章中提到了Python中函数的定义和使用,在这篇文章里我们来讨论下关于函数的一些更深的话题。在学习C语言函数的时候,遇到的问题主要有形参实参的区别、参数的传递和改变、变量的作用域。同样在Python中,关于对函数的理解和使用也存在这些问题。下面来逐一讲解。一.函
Python中的字符串 可能大多数人在学习C语言的时候,最先接触的数据类型就是字符串,因为大多教程都是以"Hello world"这个程序作为入门程序,这个程序中要打印的"Hello world"就是字符串。如果你做过自然语言处理方面的研究,并且用Python
Python 面向对象编程(一) 虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程。下面就来了解一下如何在Python中进行对象编程。一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法。 类是对现实世界中一些事物的封装,
Python面向对象编程(二) 在前面一篇文章中谈到了类的基本定义和使用方法,这只体现了面向对象编程的三大特点之一:封装。下面就来了解一下另外两大特征:继承和多态。 在Python中,如果需要的话,可以让一个类去继承一个类,被继承的类称为父类或者超类、也可以称作基类,继承的类称为子类。并且Pytho
Python中的函数(一) 接触过C语言的朋友对函数这个词肯定非常熟悉,无论在哪门编程语言当中,函数(当然在某些语言里称作方法,意义是相同的)都扮演着至关重要的角色。今天就来了解一下Python中的函数用法。一.函数的定义 在某些编程语言当中,函数声明和函数定义是区分开的(在这些编程语言当中函数声明
在windows下如何快速搭建web.py开发框架 用Python进行web开发的话有很多框架供选择,比如最出名的Django,tornado等,除了这些框架之外,有一个轻量级的框架使用起来也是非常方便和顺手,就是web.py。它由一名黑客所创建,但是不幸的是这位创建者于2013年自杀了。据说现在由
将Sublime Text 2搭建成一个好用的IDE 说起编辑器,可能大部分人要推荐的是Vim和Emacs,本人用过Vim,功能确实强大,但是不是很习惯,之前一直有朋友推荐SUblime Text 2这款编辑器,然后这段时间就试了一下,就深深地喜欢上这款编辑器了...
Python中的模块 有过C语言编程经验的朋友都知道在C语言中如果要引用sqrt这个函数,必须用语句"#include<math.h>"引入math.h这个头文件,否则是无法正常进行调用的。那么在Python中,如果要引用一些内置的函数,该怎么处理呢?在Python中
Python的基础语法 在对Python有了基础的认识之后,下面来了解一下Python的基础语法,看看它和C语言、java之间的基础语法差异。一.变量、表达式和语句 Python中的语句也称作命令,比如print "hello python"这就是一条语句。 表达式,顾名思义,是
Eclipse+PyDevʽjango+Mysql搭建Python web开发环境 Python的web框架有很多,目前主流的有Django、Tornado、Web.py等,最流行的要属Django了,也是被大家最看好的框架之一。下面就来讲讲如何搭建Django的开发环境。一.准备工作 需要下载的
在windows下安装配置Ulipad 今天推荐一款轻便的文本编辑器Ulipad,用来写一些小的Python脚本非常方便。 Ulipad下载地址: https://github.com/limodou/ulipad http://files.cnblogs.com/dolphin0520/u...
Python中的函数(三) 在前面两篇文章中已经探讨了函数的一些相关用法,下面一起来了解一下函数参数类型的问题。在C语言中,调用函数时必须依照函数定义时的参数个数以及类型来传递参数,否则将会发生错误,这个是严格进行规定的。然而在Python中函数参数定义和传递的方式相比而言就灵活多了。一.函数参数的
在Notepad++中搭配Python开发环境 Python在最近几年一度成为最流行的语言之一,不仅仅是因为它简洁明了,更在于它的功能之强大。它不仅能够完成一般脚本语言所能做的事情,还能很方便快捷地进行大规模的项目开发。在学习Python之前我们来看一下Python的历史由来,"Pytho
Python中的条件选择和循环语句 同C语言、Java一样,Python中也存在条件选择和循环语句,其风格和C语言、java的很类似,但是在写法和用法上还是有一些区别。今天就让我们一起来了解一下。一.条件选择语句 Python中条件选择语句的关键字为:if 、elif 、else这三个。其基本形式如
关于raw_input( )和sys.stdin.readline( )的区别 之前一直认为用raw_input( )和sys.stdin.readline( )来获取输入的效果完全相同,但是最近在写程序时有类似这样一段代码:import sysline = sys.stdin.readline()
初识Python 跟学习所有的编程语言一样,首先得了解这门语言的编程风格和最基础的语法。下面就让我们一起来了解一下Python的编程风格。1.逻辑行与物理行 在Python中有逻辑行和物理行这个概念,物理行是指在编辑器中实际看到的一行,逻辑行是指一条Python语句。在Python中提倡一个物理行只
当我们的代码是有访问网络相关的操作时,比如http请求或者访问远程数据库,经常可能会发生一些错误,有些错误可能重新去发送请求就会成功,本文分析常见可能需要重试的场景,并最后给出python代码实现。
1.经典迭代器 2.将Sentence中的__iter__改成生成器函数 改成生成器后用法不变,但更加简洁。 3.惰性实现 当列表比较大,占内存较大时,我们可以采用惰性实现,每次只读取一个元素到内存。 或者使用更简洁的生成器表达式 4.yield from itertools模块含有大量生成器函数可
本文介绍简单介绍socket的常用函数,并以python-kafka中的源码socketpair为例,来讲解python socket的运用
python实践中经常出现编码相关的异常,大多网上找资料而没有理解原理,导致一次次重复错误。本文对常用Unicode、UTF-8、GB2312编码的原理进行介绍,接着介绍了python字符类型unicode和str以及常见编解码错误UnicodeEncodeError和UnicodeDEcodeEr