5

我想创建一个伪彩色图(例如contouror 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()

阴谋

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

4

1 回答 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功能。

于 2013-05-22T16:37:30.803 回答