Как отображать statsmodels Mosaics напрямую с Bokeh - PullRequest
0 голосов
/ 15 декабря 2018

Я хочу создать мозаичные графики для визуализации таблиц непредвиденных обстоятельств.Bokeh не поддерживает (насколько мне известно) встроенную поддержку Bokeh, поэтому я использую библиотеку statsmodels ( link ).

mosaicplot

Проблема в том, что графики из этой библиотеки не расширяют интерфейс Figure Боке, поэтому я не могу их отобразить на веб-странице.В идеале я хочу, чтобы пользователь мог выбирать интересующие его переменные с помощью раскрывающихся списков на веб-странице:

webui

Как можно получить результаты statsmodelsmosaic будет отображаться непосредственно Bokeh?

1 Ответ

0 голосов
/ 19 декабря 2018

Bokeh не поддерживает мозаичные диаграммы напрямую, однако функция mosaic может возвращать все геометрические данные, необходимые для того, чтобы Bokeh отображал сам график.Кроме того, если вы передадите ax=None:

_, rects_dict = mosaic(df, ..., ax=None)

, то создание графика Matplotlib будет подавлено.Ниже приведен полный пример, который демонстрирует, как использовать возвращаемое значение rects_dict из mosaic:

import pandas as pd
from statsmodels.graphics.mosaicplot import mosaic
from bokeh.plotting import figure, ColumnDataSource, show
from bokeh.transform import factor_cmap

df = pd.DataFrame({
    'size' : ['small', 'medium', 'medium', 'large', 'small', 'large', 'small', 'medium'],
    'length' : ['long', 'short', 'long', 'short', 'long', 'long', 'short', 'short']
})

_, rects_dict = mosaic(df, ['size', 'length'], gap=0, ax=None)

rects = rects_dict.values()
cats = rects_dict.keys()

source = ColumnDataSource(data=dict(
    x    = [r[0]+r[2]/2 for r in rects], # bokeh wants x center, not corner
    y    = [r[1]+r[3]/2 for r in rects], # bokeh wants y center, not corner
    w    = [r[2]        for r in rects],
    h    = [r[3]        for r in rects],
    size = [c[0]        for c in cats ],
    len  = [c[1]        for c in cats ],
))

fill_cmap = factor_cmap('size', palette="Pastel1_3", factors=['small', 'medium', 'large'])

p = figure(x_range=(0,1), y_range=(0,1), x_axis_location=None, y_axis_location=None,
           tools="", toolbar_location=None, tooltips="@size @len")

p.rect(x='x', y='y', width='w', height='h', line_color="white", source=source,
       fill_color=fill_cmap)

show(p)

Это приводит к приведенному ниже графику с интерактивной всплывающей подсказкой, отображающей категории.Вы также можете добавить цветовую панель или любые другие интерактивные функции Bokeh непосредственно стандартными способами Bokeh:

enter image description here

...