在不更改实际绘图的情况下设置 matplotlib 颜色条的限制

Jan*_*Jan 5 matplotlib contour colorbar

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

在下面的示例中,数据 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()
Run Code Online (Sandbox Code Playgroud)

阴谋

现在,我想“放大”颜色条,即生成一个范围从 3000 到 6000 的颜色条。这个新的颜色条仍将作为图例并为每个刻度提供适当的颜色(3000 = 蓝色,6000 = 黄色)。既不实现cbar.set_clim()也不cf.set_clim()实现这一点。

tac*_*ell 4

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

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()
Run Code Online (Sandbox Code Playgroud)

我称其为 hacky,因为它涉及到颜色条的一大堆内部结构。 cbar.outline是一个Line2D对象,它是颜色条周围的黑框,设置set_ydata角上的 ydata 以匹配您要查看的子区域。尝试去掉那条线,看看会发生什么。

您可能想研究一下颜色图的clip功能。