Holoviews - Как создать параллельные панели из столбцов фрейма данных?

Я хотел бы создать гистограмму Holoviews (используя бэкэнд Bokeh), в которой год находится на оси X, а столбцы A и B - на оси Y. Для каждого года я хочу, чтобы столбцы для значений из столбцов A и B отображались рядом друг с другом, то есть для года 2008 у меня есть столбцы высотой 1 и 3, для года 2009 у меня есть столбцы высоты 3 и 6 и так далее. Я пробовал множество разных способов, включая пример сгруппированных полос в документации, но не могу заставить его работать. См. Пример ниже:

%%opts Bars [xrotation=90 width=600 show_legend=False tools=['hover']]
df=pd.DataFrame({'Year':[2008,2009,2010,2011,2012,2013],
   'A': [1,2,3,4,5,6],'B':[3,6,9,12,15,18]})
print(df)
bars = hv.Bars(df, kdims=['Year'], vdims=['A'])
bars

Пожалуйста помоги. Я схожу с ума!


person pongo30    schedule 28.09.2018    source источник


Ответы (1)


HoloViews обычно работает лучше всего, когда ваши данные находятся в так называемом аккуратном формате. Однако, чтобы упростить работу с данными, подобными вашим, мы разработали сопутствующую библиотеку под названием hvPlot. Чтобы сгенерировать нужный сюжет, вы можете просто запустить:

import hvplot.pandas
df=pd.DataFrame({'Year':[2008,2009,2010,2011,2012,2013],
   'A': [1,2,3,4,5,6],'B':[3,6,9,12,15,18]})
df.hvplot.bar('Year')

введите здесь описание изображения

В качестве альтернативы вы можете узнать о методе pd.melt, который может принимать ваши данные в широком формате и преобразовывать их в аккуратный набор данных:

%%opts Bars [xrotation=90 width=600 show_legend=False tools=['hover']]
df=pd.DataFrame({'Year':[2008,2009,2010,2011,2012,2013],
   'A': [1,2,3,4,5,6],'B':[3,6,9,12,15,18]})
tidy_df = df.melt(id_vars=['Year'], value_vars=['A', 'B'])
bars = hv.Bars(tidy_df, ['Year', 'variable'], ['value'])
bars
person philippjfr    schedule 28.09.2018
comment
Спасибо, это хорошо работает! Не знал о hvplot! Продолжение, знаете ли вы, есть ли способ подавить печать «A» и «B» на оси x, чтобы я мог сделать ее менее загроможденной? Вместо этого я планирую создать легенду. - person pongo30; 28.09.2018