Skip to content

Instantly share code, notes, and snippets.

@fgoinai
Last active December 29, 2017 08:56
Show Gist options
  • Save fgoinai/f1be196c03efc5bafa3da1cf5d01dfd7 to your computer and use it in GitHub Desktop.
Save fgoinai/f1be196c03efc5bafa3da1cf5d01dfd7 to your computer and use it in GitHub Desktop.
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)
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