research / widgets /charts.py
haoqi7's picture
Upload 47 files
16188ba
raw
history blame contribute delete
No virus
2.41 kB
from typing import List
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure
from bokeh.transform import dodge
import numpy as np
COLORS = [
'#FE2D01',
'#016CFE',
'#FEB101',
'#FE018B',
'#AAB7B8',
'#212F3D'
]
'''
clusters = ['Cluster 1', 'C 2', 'C 3', 'Plums', 'Grapes', 'Strawberries']
years = ['number of papers', 'number of keyphrases', ]
data = {'clusters': clusters,
f'{years[0]}': [2, 1, 4, 3, 2, 4],
f'{years[1]}': [5, 3, 3, 2, 4, 6],
}
source = ColumnDataSource(data=data)
p = figure(x_range=clusters, title="Fruit counts by year",
toolbar_location=None, tools="")
p.vbar(x=dodge('clusters', -0.25, range=p.x_range), top=f'{years[0]}', width=0.2, source=source,
color="#c9d9d3", legend_label="2015")
p.vbar(x=dodge('clusters', 0.0, range=p.x_range), top=f'{years[1]}', width=0.2, source=source,
color="#718dbf", legend_label="2016")
p.x_range.range_padding = 0.1
p.xgrid.grid_line_color = None
p.legend.location = "top_left"
p.legend.orientation = "horizontal"
'''
def build_bar_charts(x_range: List, y_names: List[str], y_data = List[List]):
valid_y = lambda x: len(x) == len(x_range)
if not (len(y_names) == len(y_data) and all(map(valid_y,y_data))):
raise RuntimeError('The data shapes are not aligned.')
if len(y_names) % 2 == 0:
offsets = [-0.125 - 0.25*(i-1) for i in range(len(y_names)//2,0,-1)]
offsets += [0.125 + 0.25*(i) for i in range(len(y_names)//2)]
else:
offsets = [-0.25 * i for i in range(len(y_names)//2,0,-1)]
offsets.append(0)
offsets += [0.25* (i+1) for i in range(len(y_names)//2)]
data = {
'x': x_range
}
for i,y in enumerate(y_data):
data[f'y{i}'] = y
source = ColumnDataSource(data)
p = figure(x_range=x_range,
tools = "box_zoom,save,reset",
height=500,
y_range=(0,np.max(y_data)+10)
)
for i,y in enumerate(y_data):
p.vbar(x=dodge('x', offsets[i], range=p.x_range), top=f'y{i}', width=0.2, source=source,
color=COLORS[i], legend_label=y_names[i])
p.x_range.range_padding = 0.1
p.xgrid.grid_line_color = None
p.legend.location = "top_left"
p.legend.orientation = "horizontal"
return p