In [1]:
from bokeh.io import output_notebook, show
from bokeh.plotting import figure
from bokeh.palettes import Blues4
from bokeh.transform import factor_cmap
import bokeh.models as bm
import pandas as pd
import chartify
output_notebook()
In [2]:
df = pd.read_csv('tmp_df2_percentual_and_absolute.csv', index_col=0)
df.head()
Out[2]:
In [3]:
df.head()
Out[3]:
In [4]:
lookup = {'100%': 0, '80%+': 1, '50%+': 2, '50%-': 3}
df['similarity_index'] = df.similarity.apply(lambda x: lookup[x])
df = df.sort_values(by=['group', 'similarity_index'])
df['top'] = df.groupby('group').cumsum()['percentual']
df['bottom'] = df.top - df.percentual
df['absolute_text'] = df.absolute.apply(lambda x: f'n = {x:,}')
df
Out[4]:
In [5]:
source = bm.ColumnDataSource(df)
similarities = list(df.similarity.unique())
groups = list(df.group.unique())
p = figure(x_range=groups, y_range=(0, 1), tools='')
p.vbar(
x='group',
bottom='bottom',
top='top',
width=0.9,
color=factor_cmap('similarity', palette=Blues4, factors=similarities),
source=source,
legend='similarity',
)
text_palette = [Blues4[-1]] * 2 + [Blues4[0]] * 2
p.text(
x='group',
y='top',
text='absolute_text',
source=source,
text_color=factor_cmap('similarity', palette=text_palette, factors=similarities),
text_align='center',
text_font_size='8pt',
y_offset=15
)
p.yaxis.minor_tick_out = None
p.legend.location = (p.plot_width - 150, 10)
#p.yaxis.axis_label = "%"
p.yaxis.formatter = bm.NumeralTickFormatter(format='1%')
#p.add_tools(bm.HoverTool(tooltips="<p>Absolute: @absolute{,}</p><p>Similarity: @similarity</p>"))
p.toolbar_location = None
show(p)
In [6]:
p = chartify.Chart(x_axis_type='categorical', blank_labels=True)
p.style.set_color_palette('sequential')
p.set_title("Chartified")
p.set_subtitle("Some additional stuff")
p.plot.bar_stacked(
data_frame=df,
categorical_columns=['group'],
numeric_column='percentual',
stack_column='similarity',
stack_order=similarities[::-1],
)
p.figure.tools = []
p.figure.y_range.end = 1.2
p.figure.yaxis.minor_tick_out = None
p.axes.set_yaxis_tick_format('1%')
p.show()
In [ ]: