2017-04-13 58 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