Python和科学计算认证群组  - 讨论区

标题:matplotlib.pyplot.contourf

2011年01月20日 星期四 13:13

import matplotlib.pyplot as plt


ax = plt.subplot(111)

cs = ax.contourf(x, y, z, levels = [0, 0.5, 1, 10], extend = 'max', cmap = plt.cm.rainbow)

 

plt.colorbar(cs, shrink=0.8)

 但是这样画出来的图,用到的颜色感觉并不是从rainbow里面均匀取出的。比如说rainbow中定义了100个颜色,请问怎样才能让level定义的几个区域均匀间隔的从rainbow中使用颜色来填充呢?

不知道我有没有表达清楚。

谢谢了~

 

2011年01月20日 星期四 18:49

那个颜色映射是线性的,根据z中的数据自动决定所取的颜色。因为levels不是均匀的,所以取色也不是均匀的。你可以通过colors直接指定每个level的颜色。所指定的颜色可以使用rainbow取出均匀的颜色,例如:

>>> plt.cm.rainbow(np.arange(4)*255.0/3)

 

2011年01月20日 星期四 19:05

255是指rainbow这个colormap里面有256个颜色吧?那是所有matplotlib自带的colormap里都有256个颜色吗?

2011年01月20日 星期四 19:14

colormap的功能是将0到255中的整数值映射成一个颜色。至于colormap本身是由几种颜色线性变换得到的。如果值是浮点数,那么应该是从0.0到1.0。

所以刚才的程序有点问题,应该用:

plt.cm.rainbow( np.arange(4)*255/3)

或者

plt.cm.rainbow(np.linspace(0,1,4))

2011年01月20日 星期四 19:18

明白了,谢谢RY老师

2011年01月21日 星期五 12:57

RY老师,又遇到问题了。

指定colors确实可行,但是extend='max'(或者'both' 'min' )时,假设levels = [0, 0.5, 1, 10],>10的区域画出来的颜色和  [1, 10]的区域的颜色是一样的,这该怎么解决啊?

2011年01月21日 星期五 13:43

将levels中再添加一个无限大,并为这个范围指定一个颜色即可。

levels = [0, 0.5, 1, 10, np.inf]

colors = [c1, c2, c3, c4]

这样0到0.5用c1, 0.5到1用c2,1到10用c3,10到np.inf用c4。

2011年01月21日 星期五 14:14

报错了。。。

plt.colorbar(cs, shrink = 0.8, orientation='horizontal')
  File "/usr/local/lib/python2.6/dist-packages/matplotlib/pyplot.py", line 1520, in colorbar
    ret = gcf().colorbar(mappable, cax = cax, ax=ax, **kw)
  File "/usr/local/lib/python2.6/dist-packages/matplotlib/figure.py", line 1104, in colorbar
    cb = cbar.Colorbar(cax, mappable, **kw)
  File "/usr/local/lib/python2.6/dist-packages/matplotlib/colorbar.py", line 724, in __init__
    ColorbarBase.__init__(self, ax, **kw)
  File "/usr/local/lib/python2.6/dist-packages/matplotlib/colorbar.py", line 246, in __init__
    self.draw_all()
  File "/usr/local/lib/python2.6/dist-packages/matplotlib/colorbar.py", line 264, in draw_all
    self._config_axes(X, Y)
  File "/usr/local/lib/python2.6/dist-packages/matplotlib/colorbar.py", line 350, in _config_axes
    self.update_ticks()
  File "/usr/local/lib/python2.6/dist-packages/matplotlib/colorbar.py", line 286, in update_ticks
    ticks, ticklabels, offset_string = self._ticker()
  File "/usr/local/lib/python2.6/dist-packages/matplotlib/colorbar.py", line 490, in _ticker
    formatter.set_locs(b)
  File "/usr/local/lib/python2.6/dist-packages/matplotlib/ticker.py", line 430, in set_locs
    self._set_format()
  File "/usr/local/lib/python2.6/dist-packages/matplotlib/ticker.py", line 475, in _set_format
    locs = (np.asarray(self.locs)-self.offset) / 10**self.orderOfMagnitude+1e-15
OverflowError: (34, 'Numerical result out of range')

 

我这样写的:

level = [0, 0.5, 1, 10, np.inf]

colors = plt.cm.rainbow(np.linspace(0,1,len(level)-1))

.......

ax = plt.subplot(111)

cs = ax.contourf(x, y, z, colors = colors, levels = level)

plt.colorbar(cs, shrink = 0.8, orientation = 'horizontal')

plt.show()

2011年01月21日 星期五 15:51

level = [0, 0.5, 1, 10, 12]

然后extend="max"试试看。

2011年01月21日 星期五 15:56

这样的话>12的部分和  10-12的部分颜色就一样了

2011年01月21日 星期五 17:10

是啊,你希望10以上都是一个颜色吧。因此加一个12,让10-12和12以上一个颜色。可以试试找出数据的最大值,放到这里:

levels = [0, 0.5, 1, 10, np.max(z)]

不需要extend

2011年01月21日 星期五 17:27

对,之前也试过这种方法,不过最大的那个值小数位特别多,然后colorbar上面的数字全变成和它一样长度的数了。保留一下小数就行了

2011年01月21日 星期五 18:44

用colorbar的set_ticklabels功能可以任意设置刻度上的文字。

cb = plt.colorbar(...)

cb.set_ticklabels(...)

2011年01月21日 星期五 18:51

哦,试试

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号