在matplotlib颜色条上设置限制而不更改实际绘图

时间:2013-05-22 15:02:45

标签: matplotlib contour colorbar

我想创建一个伪彩色图(例如contourcontourf)和一个颜色条。出于实际原因,我希望colorbar的范围与底层的mappable不同。

在下面的示例中,数据Z的范围为0到10000,映射到色彩映射。颜色条的范围是相同的。

import numpy
from matplotlib import pyplot

X = numpy.arange(100)
Y = numpy.arange(100)
Z = numpy.arange(100**2).reshape((100,100))

f = pyplot.figure()
ax = f.gca()
cf = ax.contourf(X,Y,Z,100)
cbar = f.colorbar(cf, ticks=[3000,4000,5000,6000])

pyplot.show()

plot

现在,我想在颜色条上“放大”,即仅生成范围从3000到6000的颜色条。这个新的颜色条仍然可以作为一个图例,并为每个刻度线提供适当的颜色(3000 =蓝色,6000 =黄色)。 cbar.set_clim()cf.set_clim()都无法做到这一点。

1 个答案:

答案 0 :(得分:3)

一般来说,抑制颜色条的部分是一个坏主意,但这是一个超级黑客的方法。

import numpy
from matplotlib import pyplot

X = numpy.arange(100)
Y = numpy.arange(100)
Z = numpy.arange(100**2).reshape((100,100))

f = pyplot.figure()
ax = f.gca()
cf = ax.contourf(X,Y,Z,100)
cbar = f.colorbar(cf, ticks=[3000,4000,5000,6000])
cbar.ax.set_ylim([cbar.norm(3000), cbar.norm(6000)])
cbar.outline.set_ydata([cbar.norm(3000)] * 2 + [cbar.norm(6000)] * 4 + [cbar.norm(3000)] * 3)
cbar.ax.set_aspect(60)  # <- tweak this to get the aspect ratio you want
pyplot.show()

我称之为hacky,因为它触及了一大堆colorbar的内部结构。 cbar.outlineLine2D对象,它是颜色条周围的黑框,set_ydata设置角上的ydata以匹配您想要查看的子区域。试试这条线,看看会发生什么。

您可能需要查看colormap的clip功能。