通过matplotlib.pyplot在Python中绘图(计算面积)

时间:2014-10-21 10:25:00

标签: python python-2.7 graph matplotlib plot

我有一个问题\问题。我需要用文件中的数字绘制图形(我做了),然后我需要绘制一条连接开始和结束的线,并计算这两条线之间的区域。我尝试做出很多变化,但我不知道如何制作它......

我尝试通过matplotlib.pyplot库

enter image description here

这里的数字'在开始和之后添加连接线之后我应该得到什么。现在我需要黑线和蓝线之间的calcutale square。 PS黑色的那种直的:)

enter image description here

这是代码的源代码,我的数据文件...... 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 个答案:

答案 0 :(得分:2)

for i in range(1,2)是一个只迭代一次的循环。也许您计划增加迭代次数?如果是这样,请记住,加载数据一次更快,而不是在for循环中加载多次。您可以使用带有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])