条形图pandas带有散景的数据框

时间:2017-04-13 08:20:02

标签: python pandas dataframe bokeh

我有以下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

我首先尝试使用Bar(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. ]])

提前感谢你告诉我我做错了什么

欢呼声

2 个答案:

答案 0 :(得分:7)

在[Bokeh 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

答案 1 :(得分:5)

您的数据是透视的,所以我将其取消,然后使用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)