不改变实际图形,设置matplotlib colorbar的范围限制

5

我想创建一张伪彩色图(比如contour或者contourf),并加上一个颜色条。出于实际需要,我希望颜色条的范围与底部映射不同。

在下面的例子中,数据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个回答

4

通常来说,隐藏您的颜色条的部分是一个不好的想法,但这里有一种超级hacky的方法可以做到。

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,因为它触及了彩条的许多内部细节。 cbar.outline 是一个Line2D 对象,它是彩条周围黑色的边框,set_ydata 将角落的ydata设置为与您想查看的子区域匹配。请尝试不使用该行并查看结果。您可能需要研究一下色图的clip功能。

谢谢您的回答。您介意解释一下cbar.outline.set_ydata()是做什么的吗? - Jan
@Jan 请查看编辑。在交互式会话中运行此代码,并使用 __dict__helptype 来探索一下代码。 - tacaswell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接