2017-04-13 113 views
4

我有以下DF:条形图大熊猫数据帧与背景虚化

  [A  B  C   D 
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] 

我想获得的曲线图,如the one below

我第一次尝试与酒吧(DF),但它只是图中的第一列

p=Bar(df) 
show(p) 

我也试过:

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. ]]) 

预先感谢您让我什么,我做错了

欢呼

回答

4

在[散景0.12.6+]可以使用visual dodge

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) 
     A B  C D 
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

+0

财政,'bokeh.charts' [不再](https://github.com/bokeh/bokeh/issues/7152 )。 – Hendy

+1

@亨迪 - 你是对的,所以回答是编辑的。谢谢。 – jezrael

3

您的数据转动,所以我unpivot操作它,然后去与Bar情节,希望这是你所需要的:

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) 
+0

亲爱zipa感谢你的帮助 您的解决方案完美的作品,但是我接受了@jezrael的解决方案,我发现它稍微更易于阅读/理解 – akasolace

+0

@akasolace没问题,他总是赌我的任何时间的详细解释,但至少upvote会很好:) – zipa