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 © 2024
京ICP备05028076号