我想创建一个伪彩色图(例如contour
或contourf
)和一个颜色条。出于实际原因,我希望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()
现在,我想在颜色条上“放大”,即仅生成范围从3000到6000的颜色条。这个新的颜色条仍然可以作为一个图例,并为每个刻度线提供适当的颜色(3000 =蓝色,6000 =黄色)。 cbar.set_clim()
和cf.set_clim()
都无法做到这一点。
答案 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.outline
是Line2D
对象,它是颜色条周围的黑框,set_ydata
设置角上的ydata以匹配您想要查看的子区域。试试这条线,看看会发生什么。
您可能需要查看colormap的clip
功能。