Pandas Dataframe Bar Graph with Bokeh

I have the following df:

[ABCD 1Q18 6.9 0.0 25.0 9.9 2Q17 NaN NaN NaN NaN 2Q18 7.1 0.0 25.0 4.1 3Q17 NaN NaN NaN NaN 3Q18 7.3 0.0 25.0 5.3 4Q17 NaN NaN NaN NaN 4Q18 7.0 0.0 25.0 8.3] 

And I would like to get a schedule, for example below below

At first I tried Bar (df), but it only graphs the first column

 p=Bar(df) show(p) 

I also tried:

 p=Bar(popo, values=["A","B"]) show(p) >raise ValueError("expected an element of either %s, got %r" % (nice_join(self.type_params), value)) ValueError: expected an element of either Column(Float) or Column(String), got array([[ 6.9, 0. ]]) 

well in advance for letting me what I'm doing wrong

amuses

+5
source share
2 answers

In [Bokeh 0.12.6+], you can use visual evasion :

 from bokeh.core.properties import value from bokeh.io import show, output_file from bokeh.models import ColumnDataSource from bokeh.plotting import figure from bokeh.transform import dodge df.index = df.index.str.split('Q', expand=True) df = df.sort_index(level=[1,0]) df.index = df.index.map('Q'.join) #remove all NaNs, because not supported plotting df = df.dropna() print (df) ABCD 1Q18 6.9 0.0 25.0 9.9 2Q18 7.1 0.0 25.0 4.1 3Q18 7.3 0.0 25.0 5.3 4Q18 7.0 0.0 25.0 8.3 

 output_file("dodged_bars.html") df = df.reset_index().rename(columns={'index':'qrange'}) data = df.to_dict(orient='list') idx = df['qrange'].tolist() source = ColumnDataSource(data=data) p = figure(x_range=idx, y_range=(0, df[['A','B','C','D']].values.max() + 5), plot_height=250, title="Report", toolbar_location=None, tools="") p.vbar(x=dodge('qrange', -0.3, range=p.x_range), top='A', width=0.2, source=source, color="#c9d9d3", legend=value("A")) p.vbar(x=dodge('qrange', -0.1, range=p.x_range), top='B', width=0.2, source=source, color="#718dbf", legend=value("B")) p.vbar(x=dodge('qrange', 0.1, range=p.x_range), top='C', width=0.2, source=source, color="#e84d60", legend=value("C")) p.vbar(x=dodge('qrange', 0.3, range=p.x_range), top='D', width=0.2, source=source, color="#ddb7b1", legend=value("D")) p.x_range.range_padding = 0.2 p.xgrid.grid_line_color = None p.legend.location = "top_left" p.legend.orientation = "horizontal" show(p) 

graph

+5
source

Your data is rotated so that I did not recognize it, and then went with the Bar plot, I hope this is what you need:

 a = [6.9, np.nan, 7.1, np.nan, 7.3, np.nan, 7.0] b = [0.0, np.nan, 0.0, np.nan, 0.0, np.nan, 0.0] c = [25.0, np.nan, 25.0, np.nan, 25.0, np.nan, 25.0] d = [9.9, np.nan, 4.1, np.nan, 5.3, np.nan, 8.3] df = pd.DataFrame({'A': a, 'B': b, 'C': c, 'D': d}, index =['1Q18', '2Q17', '2Q18', '3Q17', '3Q18', '4Q17', '4Q18']) df.reset_index(inplace=True) df = pd.melt(df, id_vars='index').dropna().set_index('index') p = Bar(df, values='value', group='variable') show(p) 
+4
source

Source: https://habr.com/ru/post/1266678/


All Articles