如何在 matplotlib 中将正值设置为一种颜色,将负值设置为另一种颜色?

How can I set positive values to one color and negative values to another in matplotlib?

我有一个随机正值和负值的条形图。我想在条形图中将所有负值设置为蓝色,将所有正值设置为红色。 如何让负值变成蓝色,正值变成红色?

这是我目前所做的尝试,但出现错误:

rand = np.random.randint(-2, 2, (30))
time = np.arange(1,31,1)

plt.bar(time, rand)
plt.show()

if rand < 0:
    plt.bar(time, rand,'blue')
elif rand > 0:
    plt.bar(time, rand,'red')
    plt.show()

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-110-2154dd329d10> in <module>
----> 1 if rand < 0:
      2     plt.bar(time, rand,'blue')
      3 elif rand > 0:
      4     plt.bar(time, rand,'red')
      5     plt.show()

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

numpy 表达式rand < 0 给出了一个包含 True 和 False 值的数组。这不能用于 if-测试。在 if 测试中,整个表达式需要为 True 或 False。

但是,表达式 rand < 0 可以用作数组的索引,只选择数组中的那些索引:

from matplotlib import pyplot as plt
import numpy as np
rand = np.random.randint(-2, 2, (30))
time = np.arange(1, 31, 1)

plt.bar(time[rand < 0], rand[rand < 0], color='tomato')
plt.bar(time[rand > 0], rand[rand > 0], color='cornflowerblue')
plt.axhline(0, color='grey', lw=0.5)
plt.show()

了解 np.where

plt.bar(x, y, color=np.where(y>0, 'b', 'r'))