【问题标题】:matplotlib - barchar with blurry effectmatplotlib - 具有模糊效果的条形图
【发布时间】:2017-01-05 09:41:10
【问题描述】:

我正在使用 matplotlib 中的条形图,我专注于颜色。我有以下简单的cos:

import matplotlib.pyplot as plt

A = [5, 30, 45, 80]
X = range(4)
col = ['r','orange','y','g']
plt.bar(X, A, color = col)
plt.show()

我想要实现的是条上的模糊颜色效果,具体取决于值,从红色到绿色。我想知道我是否可以实现这样的事情(只看酒吧):

我尝试关注这个guide,但没有得到任何结果。 你能帮帮我吗?

【问题讨论】:

  • 抱歉,数字 5、30、45、80 是否还有其他含义,或者它们只是条形图的高度?您希望每个条形图都从红色开始并以绿色结束,或者它们都从红色开始但以不同的颜色结束取决于高度?
  • 你好楚,谢谢你的重播。我想要像图中的东西。所以,例如,什么时候是 5 我只想要红色,30 红色和橙色,..,100 比例的绿色。

标签: python matplotlib colors bar-chart


【解决方案1】:

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)

另外,我将 vminvmax 分别表示为 0 和 100。这将始终使总绿色出现在位置 100,总红色出现在位置 0。如果这是您正在寻找的效果,您可以按原样使用。

对我来说,通过 bar 实现更多自定义的最简单方法就是使用 X 中的值(因为它们是被颜色映射的值)。但显然你需要某种规则。在您的示例中,橙色有时出现在 40 %、其他 30 % 和 20 %(它似乎与条形的大小有关,但我不知道这种关系)。其中一个条是完全绿色的,这是另一条规则。

因此,您必须在代码中设置异常。例如,当顶部超过 90 % 时,使用绿色颜色图(或任何合适的颜色)。

【讨论】:

  • 抱歉重播晚了!这真的很有帮助,非常感谢!只是一个额外的问题:是否有可能产生像我图中的效果?比如20岁以下只有红橙,40岁以下红橙黄等等……
  • 非常感谢!我也完全同意你上次的提议,我已经想好了一些规则,我想我会沿着这条街走。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 2021-11-27
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多