使用matplotlib.pyplot在Python中绘图(计算面积)
我有一个问题。我需要根据从文件中得到的数字来绘制图表(我已经做到了),然后我需要画一条线把起点和终点连接起来,并计算这两条线之间的面积。我尝试了很多不同的方法,但不知道该怎么做。
我想通过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])