使用matplotlib.pyplot在Python中绘图(计算面积)

0 投票
1 回答
3121 浏览
提问于 2025-04-28 18:34

我有一个问题。我需要根据从文件中得到的数字来绘制图表(我已经做到了),然后我需要画一条线把起点和终点连接起来,并计算这两条线之间的面积。我尝试了很多不同的方法,但不知道该怎么做。

我想通过matplotlib.pyplot这个库来实现。

在这里输入图片描述

这是我应该得到的“图形”,在这里我需要添加“连接起点和终点的线”,现在我需要计算黑线和蓝线之间的面积。
PS:黑线是比较直的 :)

在这里输入图片描述

这里是代码的来源,还有我的数据文件... http://pastebin.com/g40bAzPR

#!/path/to/python -tt

# numerical data
# python GraphicalPart.py ../dataFile.txt

import sys
import matplotlib.pyplot as plt
import numpy as np

def startDivide(fileName):
 for i in range(1,2):
    inputFile = open(fileName)
    outputFile = open(fileName + "_" + str(i) + "_out.csv", "w")
    floatList = []
    for line in inputFile.readlines():
        data = line.split(" ")
        string = data[i]
        if string.startswith('-'): #remove '-'
            string = string[1:]
        floatList.append(float(string))

    floatList.sort() #sorting the list of data

    for item in floatList:
        outputFile.write("%s\n" % item)

    outputFile.close() 
    inputFile.close()

    data1=np.genfromtxt(fileName + "_" + str(i) + '_out.csv', skip_header=1)
    plt.plot(data1) 
    plt.savefig(fileName + "_" + str(i) + "_.png")
    plt.clf()

def main():
 if len(sys.argv) != 2:
  print "Not enough arguments. *_data.txt file only!"
 else:
  startDivide(sys.argv[1])

if __name__ == "__main__":
 main()
暂无标签

1 个回答

2

for i in range(1,2) 是一个循环,它只会执行一次。也许你打算增加循环的次数?如果是这样,记住一次性加载数据会比在循环中多次加载要快得多。你可以使用 np.genfromtxt 并通过 usecols 参数来指定你想要的列。

要计算曲线下的面积,你可以使用 np.trapz。如果要计算两条曲线之间的面积,你需要用上面曲线的面积减去下面曲线的面积。假设对角线始终在数据曲线的上方:

import sys
import matplotlib.pyplot as plt
import numpy as np

def startDivide(filename):
    data = np.genfromtxt(filename, dtype=None, usecols=[1])
    data = np.abs(data)
    data.sort()
    np.savetxt("{}_1_out.csv".format(filename), data)
    plt.plot(data)
    plt.plot([0,len(data)-1], [data[0], data[-1]])
    plt.savefig("{}_1_.png".format(filename))
    area = np.trapz([data[0], data[-1]], dx=len(data)-1) - np.trapz(data)
    print(area)

if __name__ == "__main__":
    startDivide(sys.argv[1])

撰写回答