Last active
December 29, 2017 08:56
-
-
Save fgoinai/f1be196c03efc5bafa3da1cf5d01dfd7 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from bokeh.models import DatetimeTickFormatter | |
from bokeh.plotting import figure | |
from bokeh.io import output_file, show | |
from gen import onoff_to_multiline_x_ls | |
import datetime | |
ticker = DatetimeTickFormatter( | |
seconds=['%c'], minutes=['%c'], hours=['%c'], | |
days=['%c'], months=['%c'], years=['%c'] | |
) | |
onoff = [1,0,1,0,1,1,1,0,0,1] | |
result = onoff_to_multiline_x_ls(list(zip(onoff, range(len(onoff))))) | |
result['x'] = [list(map( | |
lambda x: datetime.datetime.today() + datetime.timedelta(hours=x), | |
y | |
)) for y in result['x']] | |
p = figure() | |
p.multi_line(result['x'], result['y']) | |
p.xgrid.grid_line_color = None | |
p.xaxis.formatter = ticker | |
p.xaxis.major_label_orientation = 'vertical' | |
output_file('10test.html') | |
show(p) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import enum | |
def onoff_to_multiline_x_ls(onoff_ls, shift=0, x_interval=.5): | |
assert onoff_ls | |
assert all(map(lambda x: isinstance(x, (list, tuple)) and all(map(lambda y: isinstance(y, (int, bool)), x)), onoff_ls)) | |
assert isinstance(shift, (int, float)) | |
y_coors = [shift, shift + 1] | |
class State(enum.Enum): | |
@staticmethod | |
def __up(): | |
return [y_coors[0], y_coors[1]] | |
@staticmethod | |
def __down(): | |
return [y_coors[1], y_coors[0]] | |
@staticmethod | |
def __normal_up(size): | |
return [y_coors[1] for _ in range(size)] | |
@staticmethod | |
def __normal_down(size): | |
return [y_coors[0] for _ in range(size)] | |
NORMAL_UP = __normal_up | |
NORMAL_DOWN = __normal_down | |
UP = __up | |
DOWN = __down | |
current = State.NORMAL_UP if onoff_ls[0][0] else State.NORMAL_DOWN | |
tmp = {'x': [], 'y': []} | |
ret = {'x': [], 'y': []} | |
for onoff in map(lambda x: (1, x[1] - x_interval) if x[0] else (0, x[1] - x_interval), onoff_ls): | |
# onoff: (int[0 or 1], x_coor) | |
if onoff[0] == 1: | |
if current == State.NORMAL_DOWN: | |
tmp['x'].append(onoff[1]) | |
tmp['y'].append(y_coors[0]) | |
ret['x'].append(tmp['x']) | |
ret['y'].append(current(len(tmp['y']))) | |
tmp = {'x': [], 'y': []} | |
current = State.UP | |
tmp['y'] = current() | |
tmp['x'] = [onoff[1], onoff[1]] | |
elif current == State.NORMAL_UP: | |
tmp['x'].append(onoff[1]) | |
tmp['y'].append(y_coors[1]) | |
elif onoff[0] == 0: | |
if current == State.NORMAL_UP: | |
tmp['x'].append(onoff[1]) | |
tmp['y'].append(y_coors[1]) | |
ret['x'].append(tmp['x']) | |
ret['y'].append(current(len(tmp['y']))) | |
tmp = {'x': [], 'y': []} | |
current = State.DOWN | |
tmp['y'] = current() | |
tmp['x'] = [onoff[1], onoff[1]] | |
elif current == State.NORMAL_DOWN: | |
tmp['x'].append(onoff[1]) | |
tmp['y'].append(y_coors[0]) | |
if current == State.UP: | |
ret['x'].append(tmp['x']) | |
ret['y'].append(current()) | |
tmp = {'x': [], 'y': []} | |
current = State.NORMAL_UP | |
tmp['x'].append(onoff[1]) | |
tmp['y'].append(y_coors[1]) | |
elif current == State.DOWN: | |
ret['x'].append(tmp['x']) | |
ret['y'].append(current()) | |
tmp = {'x': [], 'y': []} | |
current = State.NORMAL_DOWN | |
tmp['x'].append(onoff[1]) | |
tmp['y'].append(y_coors[0]) | |
# fix first line to make it start from x: 0 | |
ret['x'][0][0] = 0 | |
# final state must be NORMAL DOWN/UP | |
tmp = {'x': [tmp['x'][-1], tmp['x'][-1] + x_interval], 'y': [tmp['y'][-1], tmp['y'][-1]]} | |
ret['x'].append(tmp['x']) | |
ret['y'].append(current(len(tmp['y']))) | |
return ret |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment