如何在Matplotlib中找到函数下方的面积?

3

我刚接触Python和matplotlib库,我正在尝试获取绘图中函数线下方的面积。我有一个变量ab,可以在我的图中移动一个矩形。我可能可以使用原始数学方法解决此问题,但我想知道是否有更简单的方法使用matplotlib实现我想要做的事情。

我的绘图如下:

Image

我希望获得该区域的面积

Image

如果有一种简单的方法来填充这个区域颜色,我也想听听。

以下是显示此绘图的代码:

plt.clf()
plt.draw()
plt.axis(xmin = 0, xmax = 80, ymin = 0, ymax = 5)
plt.plot(-np.cbrt(np.power(t, 2) - 16 * t + 63) +4)
currentAxis = plt.gca()
line = currentAxis.lines[0]
for x, y in zip(line.get_xdata(), line.get_ydata()):
    if x == 0 or y == 0:
        if b > a:
            currentAxis.add_patch(patches.Rectangle(((a * 80 / 11), y), (b * 80 / 11) - (a * 80 / 11), 5, fill=False))
        else:
            currentAxis.add_patch(patches.Rectangle((-(b * 80 / 11) + 80, y), -(a * 80 / 11) + (b * 80 / 11), 5, fill=False))
plt.show()

感谢您的帮助,非常抱歉无法嵌入图片。

有一个官方的matplotlib示例,展示了曲线下方的面积:integral_demo - ImportanceOfBeingErnest
2个回答

3

由于Max Power提供的答案对于你问题的整合部分非常好,我只需要解决曲线下/上方绘制区域的问题。您可以使用fill_between函数:

import numpy as np
from matplotlib import pyplot as plt
def f(t):
    return -np.cbrt(np.power(t, 2) - 16 * t + 63) +4

t = np.arange(0,80,1/40.)
plt.plot(t,f(t))

section = np.arange(22, 36, 1/20.)
plt.fill_between(section,f(section))

plt.axhline(0, color='k')
plt.axvline(0, color='k')
plt.show()

enter image description here


1
嘿,谢谢您添加这个答案,很棒 (+1)。我不知道该怎么做。 - Max Power

1

Scipy可以为您计算积分,这似乎是获得您所需的最简单的方法。不过,我认为您的图片和函数不一致。这是我复制并绘制您的函数得到的结果:

t = pd.Series(range(0,80))
plt.plot(-np.cbrt(np.power(t, 2) - 16 * t + 63) +4)

enter image description here

无论如何,这里是如何得到积分的方法,给定一个函数和积分边界。
import scipy.integrate as integrate

# define components for integral calculation
lower_bound = 22
upper_bound = 36

f = lambda t: -np.cbrt(np.power(t, 2) - 16 * t + 63) +4

# calculate integral
integral, error = integrate.quad(f, lower_bound, upper_bound)
print(integral)

-50.03118191324093


我没有表现出来,但是函数确实在负数的右侧继续。谢谢你的回答! - Drakota
嗨,Drakota,问题与“在负数中继续向右”的函数有些不同。请查看20、30和40处f(t)的特定值。在我的图表(以及Vinicius的图表)中,该函数在所有这些t值处都为负数。在您的图片中,该函数在所有这些值处均为正数。因此,我认为您不想将该图表呈现为该函数的图表。 - Max Power

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接