построение столбчатой диаграммы с использованием боке

#python #pandas #bokeh #pandas-bokeh

#python #панды #боке #pandas-bokeh

Вопрос:

Я пытаюсь построить столбчатую диаграмму с использованием bokeh, следуя этому разделу документации. но мой фрейм данных немного сложнее. это выглядит так:

    events    count     Name
    a          2       jerry
    b          1       jerry
    a          8       joe
    c          1       joe 
    b          4       megan
    c          1       megan 
   ...        ...       ...
  

data.user.nunique() = 11 (будет в столбцах) и data.event.nunique() = 167 (будут сегменты с накоплением для каждого столбца обратите внимание, что не каждый пользователь поднял все уникальные события)

итак, согласно коду из документов и для вышеупомянутого сегмента dataframe:

 output_file("stacked.html")
names = data.Name.unique()          # ['jerry','joe','megan']
events = data.events.unique()       # ['a','b','c']
colors =["#c9d9d3", "#718dbf", "#e84d60"]        

data = {'names' : names,
        'a'   : [2, 8, 0],   # a raised 2 times by jerry, 8 times by joe , 0 times by megan
        'b'   : [1, 0, 4],
        'c'   : [0, 1, 1]}  
  

мой вопрос двоякий: 1) как мне создать data словарь из моего фактического набора данных?
2) есть ли какой-либо альтернативный подход к решению этой проблемы?

Ответ №1:

для работы bokeh необязательно нужен словарь, поэтому мы можем просто использовать pivot метод Dataframe для достижения желаемого преобразования и вывести результат напрямую.

 >>> df = pd.DataFrame({
    'events': ['a', 'b', 'a', 'c', 'b', 'c'],
    'count': [2, 1, 8, 1, 4, 1],
    'Name': ['jerry', 'jerry', 'joe', 'joe', 'megan', 'megan']})

>>> df
  events  count   Name
0  a      2      jerry
1  b      1      jerry
2  a      8      joe  
3  c      1      joe  
4  b      4      megan
5  c      1      megan
  

Преобразование данных:

 >>> df2 = df.pivot(index="Name", columns="events", values="count").fillna(0)
>>> df2
events  a   b   c
Name            
jerry   2.0 1.0 0.0
joe     8.0 0.0 1.0
megan   0.0 4.0 1.0
  

Построение данных:

 from bokeh.plotting import figure
from bokeh.palettes import viridis

names = df2.index.tolist()
events = df2.columns.tolist()
color = viridis(len(events))

p = figure(x_range=names)
p.vbar_stack(events, x="Name", source=df2, width=.9, color=color), legend_label=events)
show(p)
  

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

Альтернативный способ построения этого — использовать библиотеку holoviews (просто добавив это, потому что holoviews может создавать более сжатый код, чем bokeh). Holoviews позаботится о преобразованиях данных за вас, поэтому вам не нужно никаких дополнительных усилий:

 import holoviews as hv
hv.extension("bokeh")

hv.Bars(df, kdims=["Name", "events"], vdims="count").opts(stacked=True)
  

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

Что касается альтернативных решений, я не совсем уверен. Я не вижу, чтобы визуальные сравнения были очень простыми с 167 типами событий (это 167 уникальных цветов, поэтому цвета могут быть не очень различимыми — не говоря уже о громоздкой легенде с 167 записями).). Если этот способ визуализации не помогает, я бы рекомендовал использовать библиотеку Holoviews для создания столбчатой диаграммы для каждого из ваших имен. Затем вы можете переключать график для каждого отдельного элемента, который у вас есть в данных.

 import holoviews as hv
hv.extension("bokeh")

hv.Bars(df, kdims=["Name", "events"], vdims="count").groupby("Name")
  

1

Комментарии:

1. Большое вам спасибо. это было действительно подробно и очень, очень полезно .. 🙂