matplotlib 如何使用fill_between使用where参数

bsxbgnwa  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(108)

因此,遵循教程,我尝试使用以下代码创建一个图形:

time_values = [i for i in range(1,100)]
execution_time = [random.randint(0,100) for i in range(1,100)]
fig = plt.figure()
ax1 = plt.subplot()
threshold=[.8 for i in range(len(execution_time))]
ax1.plot(time_values, execution_time)
ax1.margins(x=-.49, y=0)
ax1.fill_between(time_values,execution_time, 1,where=(execution_time>1), color='r', alpha=.3)

这不起作用,因为我得到了一个错误,说我不能比较一个列表和一个int。然而,我随后尝试:

ax1.fill_between(time_values,execution_time, 1)

这给了我一个图表,其中包含了执行时间和y=1线之间的所有区域。由于我希望y=1线上方的区域被填充,而下方的区域没有阴影,因此我创建了一个名为threshold的列表,并将其填充为1,以便我可以重新创建比较。然而,

ax1.fill_between(time_values,execution_time, 1,where=(execution_time>threshold)

ax1.fill_between(time_values,execution_time, 1)

创建完全相同的图,即使执行时间值确实超过1。
我感到困惑的原因有两个:首先,在我看的教程中,老师能够成功地比较一个列表和一个整数在fill_between函数中,为什么我不能这样做?其次,为什么where参数没有标识我想要填充的区域?即,为什么图形在y=1和执行时间值之间的区域有阴影?

eulz3vhy

eulz3vhy1#

这个问题主要是由于使用了python列表而不是numpy数组。显然你可以使用列表,但是你需要在整个代码中使用它们。

import numpy as np
import matplotlib.pyplot as plt

time_values = list(range(1,100))
execution_time = [np.random.randint(0,100) for _ in range(len(time_values))]
threshold = 50

fig, ax = plt.subplots()

ax.plot(time_values, execution_time)
ax.fill_between(time_values, execution_time, threshold,
                where= [e > threshold for e in execution_time], 
                color='r', alpha=.3)

ax.set_ylim(0,None)
plt.show()

更好的是在整个过程中使用numpy数组,它不仅更快,而且更容易编码和理解。

import numpy as np
import matplotlib.pyplot as plt

time_values = np.arange(1,100)
execution_time = np.random.randint(0,100, size=len(time_values))
threshold = 50

fig, ax = plt.subplots()

ax.plot(time_values, execution_time)
ax.fill_between(time_values,execution_time, threshold,
                where=(execution_time > threshold), color='r', alpha=.3)

ax.set_ylim(0,None)
plt.show()

相关问题