##// END OF EJS Templates
New plotter operation
Juan C. Valdez -
r865:93ebd968aca2
parent child
Show More
@@ -0,0 +1,196
1
2 import os
3 import time
4 import numpy
5 import datetime
6 import numpy as np
7 import matplotlib.pyplot as plt
8 from mpl_toolkits.axes_grid1 import make_axes_locatable
9 from matplotlib.ticker import FuncFormatter, LinearLocator
10
11 from schainpy.model.proc.jroproc_base import Operation
12
13 func = lambda x, pos: ('%s') %(datetime.datetime.utcfromtimestamp(x).strftime('%H:%M'))
14
15 d1970 = datetime.datetime(1970,1,1)
16
17
18 class PlotData(Operation):
19
20 __MAXNUMX = 80
21 __MAXNUMY = 80
22 __missing = 1E30
23
24 def __init__(self):
25
26 Operation.__init__(self)
27 self.xmin = None
28 self.xmax = None
29 self.newdataOut = None
30 self.dataOut = None
31 self.isConfig = False
32 self.figure = None
33
34 def setup(self, dataOut, **kwargs):
35
36 self.first = True
37 self.plottype = kwargs.pop('plottype', 'rti')
38 self.localtime = kwargs.pop('localtime', True)
39 self.show = kwargs.pop('show', True)
40 self.save = kwargs.pop('save', False)
41 self.pause = kwargs.pop('pause', False)
42 self.time = []
43 self.nblock = 0
44 self.z = []
45 self.data = [{} for __ in dataOut.channelList]
46 self.axes = []
47 self.colormap = kwargs.get('colormap', 'jet')
48 self.title = kwargs.get('wintitle', self.plottype.upper())
49 self.xaxis = kwargs.get('xaxis', None)
50 self.zmin = kwargs.get('zmin', None)
51 self.zmax = kwargs.get('zmax', None)
52
53 xmin = kwargs.get('xmin', 0)
54 xmax = kwargs.get('xmax', xmin+4)
55
56 dt = dataOut.datatime.date()
57 dtmin = datetime.datetime.combine(dt, datetime.time(xmin, 0, 0))
58 dtmax = datetime.datetime.combine(dt, datetime.time(xmax, 59, 59))
59
60 self.xmin = (dtmin-d1970).total_seconds()
61 self.xmax = (dtmax-d1970).total_seconds()
62
63 if self.plottype in ('rti',):
64 self.ncols = 1
65 self.nrows = dataOut.nChannels
66 self.width = 8
67 self.height = 2.2*self.nrows
68 self.ylabel = 'Range [Km]'
69 self.y = dataOut.getHeiRange()
70
71 self.ymin = kwargs.get('ymin', min(self.y))
72 self.ymax = kwargs.get('ymax', max(self.y))
73
74 if self.figure is None:
75 self.figure = plt.figure()
76 else:
77 self.figure.clf()
78
79 for n in range(dataOut.nChannels):
80 ax = self.figure.add_subplot(self.nrows, self.ncols, n+1)
81 ax.firsttime = True
82 self.axes.append(ax)
83
84 self.figure.set_size_inches (self.width, self.height)
85
86 def fill_gaps(self, x_buffer, y_buffer, z_buffer):
87
88 if x_buffer.shape[0] < 2:
89 return x_buffer, y_buffer, z_buffer
90
91 deltas = x_buffer[1:] - x_buffer[0:-1]
92 x_median = np.median(deltas)
93
94 index = np.where(deltas > 5*x_median)
95
96 if len(index[0]) != 0:
97 z_buffer[index[0],::] = self.__missing
98 z_buffer = np.ma.masked_inside(z_buffer,
99 0.99*self.__missing,
100 1.01*self.__missing)
101
102 return x_buffer, y_buffer, z_buffer
103
104 def plot(self):
105
106 dt = datetime.datetime.utcfromtimestamp(self.time[-2])
107
108 if self.plottype=='rti':
109 self.time.sort()
110 for ch in self.dataOut.channelList:
111 self.z.append([self.data[ch][t] for t in self.time])
112 self.x = np.array(self.time)
113 self.z = np.array(self.z)
114 self.plot_rti()
115
116 for n, ax in enumerate(self.axes):
117
118 if self.xaxis=='time':
119 ax.xaxis.set_major_formatter(FuncFormatter(func))
120 ax.xaxis.set_major_locator(LinearLocator(6))
121
122 ax.yaxis.set_major_locator(LinearLocator(4))
123
124 ax.set_ylabel(self.ylabel)
125 ax.set_ylim(self.ymin, self.ymax)
126 ax.set_xlim(self.xmin, self.xmax)
127
128 ax.set_title('Channel {} {}'.format(
129 self.dataOut.channelList[n],
130 dt.strftime('%y/%m/%d %H:%M:%S'),
131 size=6))
132
133 if self.save:
134 figname = os.path.join(self.save, 'rti_{}.png'.format(dt.strftime('%y%m%d_%H%M%S')))
135 print 'Saving figure: {}'.format(figname)
136 self.figure.savefig(figname)
137
138 self.figure.canvas.draw()
139 if self.show:
140 self.figure.show()
141 if self.pause:
142 raw_input('Press <ENTER> to continue')
143
144 def plot_rti(self):
145
146 for n, ax in enumerate(self.axes):
147 x, y, z = self.fill_gaps(self.x, self.y, self.z[n])
148 if ax.firsttime:
149 zmin = self.zmin if self.zmin else np.nanmin(self.z)
150 zmax = self.zmax if self.zmax else np.nanmax(self.z)
151 plot = ax.pcolormesh(x, y, z.T,
152 vmin=zmin,
153 vmax=zmax,
154 cmap=plt.get_cmap(self.colormap)
155 )
156 divider = make_axes_locatable(ax)
157 cax = divider.new_horizontal(size='3%', pad=0.05)
158 self.figure.add_axes(cax)
159 plt.colorbar(plot, cax)
160 ax.firsttime = False
161 else:
162 plot = ax.pcolormesh(x, y, z.T,
163 vmin=zmin,
164 vmax=zmax,
165 cmap=plt.get_cmap(self.colormap)
166 )
167
168 self.figure.suptitle(self.title)
169 self.figure.subplots_adjust(wspace=None, hspace=0.5)
170
171 def update(self):
172
173 self.nblock += 1
174 self.time.append(self.dataOut.ltctime)
175 if self.plottype=='rti':
176 for ch in self.dataOut.channelList:
177 self.data[ch][self.dataOut.ltctime] = self.dataOut.getPower()[ch]
178
179 def run(self, dataOut, **kwargs):
180
181 self.dataOut = dataOut
182
183 if not self.isConfig:
184 self.setup(dataOut, **kwargs)
185 self.isConfig = True
186
187 self.update()
188
189 if dataOut.ltctime>=self.xmax:
190 self.plot()
191 self.isConfig = False
192
193 def close(self):
194
195 self.plot()
196 No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now