link 上的 matplotlib 文档中有一个很好的例子。将此适应您的示例,您将获得如下内容:
import matplotlib.pyplot as plt
from matplotlib.pyplot import figure
def gbar(ax, x, y, width=0.5, bottom=0):
X = [[.6, .6], [.7, .7]]
for left, top in zip(x, y):
right = left + width
ax.imshow(X, interpolation='bicubic', cmap="copper",
extent=(left, right, bottom, top), alpha=1)
A = [5, 30, 45, 80]
x = [i + 0.5 for i in range(4)]
fig = figure()
xmin, xmax = xlim = 0.25, 4.5
ymin, ymax = ylim = 0, 100
ax = fig.add_subplot(111, xlim=xlim, ylim=ylim,
autoscale_on=False)
gbar(ax, x, A, width=0.7)
ax.set_aspect('auto')
plt.show()
,结果如下图:
编辑: 示例中的以下改编对于使用 imshow 更加灵活。示例如下:
import matplotlib.pyplot as plt
from matplotlib.pyplot import figure
def gbar(ax, x, y, width=0.5, bottom=0):
X = np.arange(100)[:, np.newaxis]
for left, top in zip(x, y):
right = left + width
mask = X > top
ax.imshow(np.ma.masked_array(X, mask), origin="lower", interpolation='nearest', cmap="RdYlGn", vmin=0, vmax=100,
extent=(left, right, bottom, 100), alpha=1)
A = [5, 30, 45, 80]
x = [i + 0.5 for i in range(4)]
fig = figure()
xmin, xmax = xlim = 0.25, 4.5
ymin, ymax = ylim = 0, 100
ax = fig.add_subplot(111, xlim=xlim, ylim=ylim,
autoscale_on=False)
gbar(ax, x, A, width=0.7)
ax.set_aspect('auto')
ax.set_yticks([i for i in range(0, 100, 10)])
ax.set_yticklabels([str(i) + " %" for i in range(0, 100, 10)])
plt.show()
,结果如下:
您会注意到我正在构建一个包含 100 个元素的数组(单调严格递增:第 1 步从 0 到 100)。
X = np.arange(100)[:, np.newaxis]
并掩盖相应栏顶部上方的所有内容:
mask = X > top
np.ma.masked_array(X, mask)
另外,我将 vmin 和 vmax 分别表示为 0 和 100。这将始终使总绿色出现在位置 100,总红色出现在位置 0。如果这是您正在寻找的效果,您可以按原样使用。
对我来说,通过 bar 实现更多自定义的最简单方法就是使用 X 中的值(因为它们是被颜色映射的值)。但显然你需要某种规则。在您的示例中,橙色有时出现在 40 %、其他 30 % 和 20 %(它似乎与条形的大小有关,但我不知道这种关系)。其中一个条是完全绿色的,这是另一条规则。
因此,您必须在代码中设置异常。例如,当顶部超过 90 % 时,使用绿色颜色图(或任何合适的颜色)。