我正在尝试在 Python 中使用 Matplotlib 执行代码,并在使用 fill_between() for matplotlib 3.3.0 时遇到以下问题

问题描述

我试图填充图中的区域 (allDevSalaries >= pythonDevSalaries )。但是,在我执行代码后,它没有显示正在填充的区域。我提供了下面的代码及其生成的图表。有人可以帮我吗?

from matplotlib import pyplot as plt

age = [21,22,23]

allDevSalaries = [12000,13000,13500]

pythonDevSalaries = [13000,12000,14545]

plt.plot(age,allDevSalaries,label='All Dev')

plt.plot(age,pythonDevSalaries,label='Python Dev')

plt.fill_between(age,where=(allDevSalaries >= pythonDevSalaries ),interpolate=True,color='red',label='Above Avg',alpha=0.25)

plt.legend()

plt.xlabel('AGE')

plt.ylabel('SALARY')

plt.title('SALARY per AGE graph')

#plt.grid()

plt.show()

enter image description here

解决方法

你的 where 子句是罪魁祸首。

来自文档:

其中:布尔数组(长度为 N),可选,默认值:无

它需要一个布尔值数组,而您通过比较两个 Python 列表来为它提供一个布尔值。

allDevSalaries = [12000,13000,13500]
pythonDevSalaries = [13000,12000,14545]
print(allDevSalaries > pythonDevSalaries) # -> False

此代码将起作用:

plt.fill_between(age,pythonDevSalaries,allDevSalaries,where=([a >= b for a,b in zip(allDevSalaries,pythonDevSalaries)]),interpolate=True,color='red',label='Above Avg',alpha=0.25)

或者,您可以使用 numpy 数组,它们在相互比较时返回一组布尔值,就像您想要的那样。

import numpy as np
...
where=(np.asarray(allDevSalaries) >= np.asarray(pythonDevSalaries)) # -> [False True False]

enter image description here