Сделайте vbar с stdev из dataframes для среднего и stdeviation - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть 2 фрейма данных, 1 для среднего и стандартного отклонения, и я пытаюсь превратить их в гистограмму в боке с ошибками, но я застрял в том, как группировать ?? «Дизайн» и лечение ».

По сути, я пытаюсь получить 3 бара на значение x (от T0 до T2). Легенда должна показывать что-то вроде: «мышь-да», «мышь-нет» и «кошка-нет». Как мне реструктурировать dict или dataframe, чтобы преобразовать что-то для vbar? И как мне связать это с фреймом данных stdev?

Кроме того, есть ли способ, чтобы x_range на рисунке автоматически брал все исходные значения из столбца «Время»? Я хотел бы иметь возможность поменять местами столбцы «Время», «Дизайн» и «Обработка» для оси X. Я предполагаю, что именно здесь пригодится сводная таблица.

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


output_file("dodged_bars.html")

import pandas as pd
dat_mean=[['T0','mouse','yes',25],['T0','mouse','no',24],['T0','cat','no',23],['T1','mouse','yes',15],['T1','mouse','no',14],['T1','cat','no',13],['T2','mouse','yes',5],['T2','mouse','no',4],['T2','cat','no',3]]
df_mean= pd.DataFrame(dat_mean,columns = ["Time", "Design", "Treatment", "Mean for Cmpd1"])

dat_std=[['T0','mouse','yes',5],['T0','mouse','no',5],['T0','cat','no',5],['T1','mouse','yes',2.5],['T1','mouse','no',2.5],['T1','cat','no',2.5],['T2','mouse','yes',1],['T2','mouse','no',1],['T2','cat','no',1]]
df_std= pd.DataFrame(dat_std,columns = ["Time", "Design", "Treatment", "Mean for Cmpd1"])



data = df_mean.to_dict(orient='list')*

dates = df_mean['Time'].tolist()

source = ColumnDataSource(data=data)

p = figure(x_range=['T0', 'T1', 'T2'], y_range=(0, 30), plot_height=250, title="Bokeh plot",
           toolbar_location=None, tools="")



p.x_range.range_padding = 0.1
p.xgrid.grid_line_color = None
p.legend.location = "top_left"
p.legend.orientation = "horizontal"

show(p)

1 Ответ

0 голосов
/ 09 сентября 2018
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


output_file("dodged_bars.html")

import pandas as pd
dat_mean=[['T0','mouse','yes',25],['T0','mouse','no',24],['T0','cat','no',23],['T1','mouse','yes',15],['T1','mouse','no',14],['T1','cat','no',13],['T2','mouse','yes',5],['T2','mouse','no',4],['T2','cat','no',3]]
df_mean= pd.DataFrame(dat_mean,columns = ["Time", "Design", "Treatment", "Mean for Cmpd1"])

dat_std=[['T0','mouse','yes',5],['T0','mouse','no',5],['T0','cat','no',5],['T1','mouse','yes',2.5],['T1','mouse','no',2.5],['T1','cat','no',2.5],['T2','mouse','yes',1],['T2','mouse','no',1],['T2','cat','no',1]]
df_std= pd.DataFrame(dat_std,columns = ["Time", "Design", "Treatment", "Mean for Cmpd1"])

time_seq=df_mean['Time'].drop_duplicates()
time_vals=time_seq.tolist()
MEANs=df_mean.groupby(["Design", "Treatment"])["Mean for Cmpd1"].apply(list).to_dict()

keys=[]
for h in range(len(MEANs)):
    raw_key=list(MEANs.keys())[h]
    keys.append(raw_key[0]+'_'+raw_key[1])

results = {'time_vals' : time_vals,
        keys[0]   : list(MEANs.values())[0],
        keys[1]   : list(MEANs.values())[1],
        keys[2]   : list(MEANs.values())[2]}

source = ColumnDataSource(data=results)

p = figure(x_range=['T0', 'T1', 'T2'], y_range=(0, 30), plot_height=250, title="Bokeh plot",
           toolbar_location=None, tools="")
for hh in range(len(MEANs)):
    p.vbar(x=dodge('time_vals', -0.25+.2*hh, range=p.x_range), top=keys[hh], width=0.2, 
       source=source,color=color[hh], legend=value(keys[hh]))


p.x_range.range_padding = 0.1
p.xgrid.grid_line_color = None
p.legend.location = "top_left"
p.legend.orientation = "horizontal"

show(p)

Этот код работает. Панели ошибок могут быть сделаны с помощью функций add_layout и Whisker

...