我有一个创建this plot的代码,但我不知道如何删除"运河1" - 红线,以及"运河3" - 蓝线,那些垂直线。两条运河都有266336条记录,你能帮忙吗? 红色垂直线是第一个记录,蓝色是最后一个记录。
import iodata as io
import matplotlib.pyplot as plt
import numpy as np
import time
testInstance = io.InputConverter()
start = time.time()
conversionError = io.ConversionError()
#f = testInstance.convert(r"S:\Python\", 1", conversionError)
f = testInstance.convert(r"/Users/Hugo/20160401", "201604010000",
conversionError)
end = time.time()
print("time elapsed " + str(end - start))
if(conversionError.conversionSucces):
print("Conversion succesful")
if(conversionError.conversionSucces == False):
print("Conversion failed: " + conversionError.conversionErrorLog)
print "Done!"
# Create a new subplot for two canals 1 & 3
a = np.amin(f.f)
filename = 'C:/Users/Hugo/20160401/201604010000.dat'
d = open(filename,'rb')
t = u"\u00b0"
headersize = 64
header = d.read(headersize)
ax1 = plt.subplot(211)
ax1.set_title(header[:16] + ', ' + # station name
'Canals: '+header[32:33]+' and '+header[34:35]+ ', ' # canals
+'Temp'+header[38:43]+t+'C' # temperature
+', '+'Time:'+header[26:32]+', '+'Date'+' '+header[16:26]) # date
plt.ylabel('Pico Tesle [pT]')
plt.xlabel('Time [ms]')
plt.plot(f.f[0,], label='Canal 1', color='r', linewidth=0.75, linestyle="-")
plt.plot(f.f[1,], label='Canal 3', color='b', linewidth=0.75, linestyle="-")
plt.legend(loc='upper right', frameon=False)
plt.grid()
# Create a new subplot for FFT
plt.subplot(212)
plt.title('Fast Fourier Transform')
plt.ylabel('Power [a.u.]')
plt.xlabel('Frequency Hz')
FFTdata = np.sqrt(f.f[0,]*f.f[0,]+f.f[1,]*f.f[1,])**1
samples = FFTdata.size
duration = 300 # in seconds
Fs = float(samples)/duration # sampling frequency (sample/sec)
delta_t = 1.0/Fs
t = np.arange(0, samples, 1)*delta_t
FFTdata_freq = np.abs(np.fft.rfft(FFTdata))**2
freq = np.fft.rfftfreq(samples, d=delta_t)
# Printing data
plt.semilogy(freq, FFTdata_freq)
plt.grid()
#plt.savefig('S:/Hugo/'+"201604010000"+'.png', bbox_inches =
'tight')
plt.show()
f.f
的内容:
>>> print f.f[0,]
[ -59.57011259 -74.20675537 -90.53224156 ..., -1676.9703173 -1676.9703173 -1676.9703173 ]
>>> print f.f[1,]
[ 1.48413511e+00 4.96417605e+00 8.39303992e+00 ..., -1.67697032e+03 -1.67697032e+03 -1.67697032e+03]
iodata代码:
import struct
import numpy as np
class ConversionError:
def __init__(self):
self.conversionSucces = True
self.conversionErrorLog = "Correct"
def reportFailure(self, errorlog):
self.conversionSucces = False
self.conversionErrorLog = errorlog
class DataStruct:
def __init__(self,f,initTime,headerString):
self.f = f
self.initTime = initTime
self.headerString = headerString
class InputConverter:
def __init__(self):
self.midAdc = 65536/2
self.convFactor = 19.54
def convert(self,filePath,fileName,conversionLog):
try:
d_file = open(filePath + "/" + fileName + ".dat", mode='rb')
except IOError as e:
conversionLog.reportFailure(e.strerror)
file = d_file.read()
datalen = len(file)
headerString = file[:43]
initime, = struct.unpack('>H', file[48:50])
expectedMatrixWidth = (datalen - 72)/4
outputMatrix = np.zeros((2, expectedMatrixWidth))
index = 0;
print "Processing..."
for i in range(64, datalen-8, 4):
e1, e2 = struct.unpack('>HH',file[i:i+4])
outputMatrix[0, index] = (e1 - self.midAdc)/self.convFactor
outputMatrix[1, index] = (e2 - self.midAdc)/self.convFactor
index += 1
return DataStruct(outputMatrix,initime,headerString)
答案 0 :(得分:1)
您可以尝试使用数组切片:
plt.plot(f.f[0,][1:], label='Canal 1', color='r', linewidth=0.75, linestyle="-")
plt.plot(f.f[1,][:-1], label='Canal 3', color='b', linewidth=0.75, linestyle="-")
编辑:
由于数据的性质,切片不仅仅是第一个/最后一个数据点是合适的,正如@Dascienz在评论中所建议的那样。像这样的东西,其中第一个和最后50个数据点从两个系列中切除:
plt.plot(f.f[0,][50:-50], label='Canal 1', color='r', linewidth=0.75, linestyle="-")
plt.plot(f.f[1,][50:-50], label='Canal 3', color='b', linewidth=0.75, linestyle="-")
答案 1 :(得分:0)
为什么我的第一个答案似乎没有效果的冗长解释...
从第1道移除第一个数据点,从第3道移除最后一个数据点,不会消除异常。 许多数据点对它们有贡献。
查看f.f[0,]
(运河1,红色)和f.f[1,]
(运河3,蓝色)的最后三个数据点:它们都是相同的值:-1676.97003...
。这解释了图表右侧的紫色(即红色和蓝色)尖峰。
另外,请查看f.f[0,]
(运河1,红色)的前三个值:它们大致为-60
,-75
和-90
。显然,摆脱第一个不会删除图表左侧的异常,其中值一直上升到500
以上,并且下降到小于-500
。这些值必须出现在2
以上的索引处,但仍远低于50000
,这就是看起来的原因,就像它们出现在0
一样。
简而言之,要删除异常,您需要在绘制数据之前更仔细地清理数据,而不是仅仅切掉第一个和/或最后一个值(这是我原来的答案所做的,而且我认为是正确的)。