I have been cleaning up my example as found in:
https://github.com/bokeh/bokeh/issues/1564
I realized there are some enhancements that could be made to make it easier to interpret.
so I added several more rect’s to get the attached visual output.
The issue is, I cannot seem to find anyway to set an offset for the colored rectangles.
I looked into:
https://github.com/bokeh/bokeh/blob/master/bokeh/_glyph_functions.py
On that page I see it is specifying line_properties and fill_properties:
"
In addition the the parameters specific to this glyph,
:ref:userguide_objects_line_properties
and :ref:userguide_objects_fill_properties
are also accepted as keyword parameters.
"
The filled areas are the % of the column that is taken up by that food preference, but I think it would be quite preferable to have them left aligned within the gray box. I believe I could work that out with an offset.
Here is the full example:
import bokeh.plotting as bk
import pandas as pd
#output goes to the notebook
bk.output_notebook()
#prepare the data
df = pd.DataFrame([
[0, ‘Banana’, “[-30, -1]”, 0.25],
[1, ‘Grape’, “[-30, -1]”, 0.25],
[2, ‘Nut’, “[-30, -1]”, 0.25],
[3, ‘Coconut’, “[-30, -1]”, 0.15],
[4, ‘Cat’, “[-30, -1]”, 0.10],
[0, ‘Banana’, “[0, 0]”, 0.45],
[1, ‘Coconut’, “[0, 0]”, 0.30],
[2, ‘Grape’, “[0, 0]”, 0.20],
[3, ‘Cat’, “[0, 0]”, 0.04],
[4, ‘Nut’, “[0, 0]”, 0.01],
[0, ‘Coconut’, “[1, 30]”, 0.85],
[1, ‘Banana’, “[1, 30]”, 0.06],
[2, ‘Cat’, “[1, 30]”, 0.05],
[3, ‘Grape’, “[1, 30]”, 0.02],
[4, ‘Nut’, “[1, 30]”, 0.02],
],
columns=[‘rankof’,‘typeof’,‘periodof’, ‘perof’]
)
x_axis_labels = list(set(df.periodof))
color_list = [’#E39898’, ‘#E3C098’, ‘#ABE398’, ‘#98ABE3’, ‘#CCCCCC’ ]
#color_list = [‘red’,‘orange’,‘green’,‘blue’,‘black’]
list_of_levels = list(set(df.typeof))
shortened_text = [x[:14] for x in df.typeof]
colors = [color_list for x in
[list_of_levels.index(x) for x in df.typeof]
]
#build out segment data
segments =
for level in list_of_levels:
for i in range(len(x_axis_labels)-1):
segments.append([
(x_axis_labels[i], list(df.rankof[(df.typeof == level) & (df.periodof == x_axis_labels[i])])[0]),
(x_axis_labels[i+1], list(df.rankof[(df.typeof == level) & (df.periodof == x_axis_labels[i+1])])[0]),
color_list[list_of_levels.index(level)],
level
])
#create a new figure
p = bk.figure(
title=“Transitional Food preferences across periods”,
y_range=[-1,5],
x_range=x_axis_labels
)
#create the plot
p.segment(
[x[0][0] for x in segments],
[x[0][1] for x in segments],
[x[1][0] for x in segments],
[x[1][1] for x in segments],
color=[x[2] for x in segments],
line_alpha=1,
fill_alpha=1,
line_width=5
)
B_WIDTH = .7
B_HEIGHT = .4
#setup white rect to obscure the line in background
p.rect(df.periodof, df.rankof, B_WIDTH, B_HEIGHT, color="#FFFFFF",fill_alpha=1)
#setup color feels according to the percent
p.rect(df.periodof, df.rankof, B_WIDTH*df.perof, B_HEIGHT, color=colors,fill_alpha=1)
#setup outline to bound the effictive region.
p.rect(df.periodof, df.rankof, B_WIDTH, B_HEIGHT, color=None, fill_alpha=1, line_color="#808080", line_width=3)
#p.rect(df.periodof, df.rankof, B_WIDTH, B_HEIGHT, color=colors,fill_alpha=1, line_color="#808080")
p.text(df.periodof, df.rankof, shortened_text, 0,
text_align=“center”, text_baseline=“middle”)
nope p.line(df.periodof,df.rankof)
#customize axes
xa, ya = p.axis
xa.axis_label = ‘Day_sep ranges’
ya.axis_label = ‘Frequency Ranks’
p.xgrid.grid_line_color = None
p.ygrid.grid_line_color = None
#show the plots
bk.show(p)