Как построить боке многострочный датафрейм из CSV - PullRequest
1 голос
/ 04 апреля 2019

У меня есть фрейм данных, считанный из .csv в следующем формате:

version, 2x8x8, 2x8x10, 2x8x12, ...
v1.0.0,  10.2,  9.2,    8.2,
v1.0.1,  11.3,  10.4,   10.2,
v1.0.2,  9.5,   9.3,    9.1,  
...

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

Я попытался сослаться на сами документы bokeh , но не могу найти лучший способ извлечь столбцы в виде "списков списков", как ожидает bokeh.

# produces empty plot
f = figure(title='Example title')
versions = list(df['version'])
values = [list(df['2x8x8']), list(df['2x8x10']), ...]
f.multi_line(xs=versions, ys=values)

Когда я пытаюсь использовать альтернативный подход ColumnDataSource, также указанный в bokeh docs , график принимает все мои значения y и создает новую строку для каждого.

# produces plot seen below
df = pd.read_csv(my.csv)
data_source = ColumnDataSource(df)
f = figure(title="Example")
f.line(x='version', y='2x8x8', source=data_source, line_width=2, legend='2x8x8')
f.line(x='version', y='2x8x10', source=data_source, line_width=2, legend='2x8x10')
f.xaxis.axis_label = 'version'

Любая помощь очень ценится!

enter image description here

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Другая версия, включая ярлыки.Это другой подход, использующий явно ColumnDataSource вместо панд DataFrame.

Обратите внимание, что если вы хотите использовать p.legend.click_policy = "hide" для переключения видимости или отключения отдельных строк, то вам лучше использовать line глиф вместо multi_line.Этот код работает для Bokeh v1.0.4

from bokeh.palettes import Spectral11
from bokeh.plotting import figure, show
from bokeh.models import Legend, ColumnDataSource

versions = ['v1.0.0', 'v1.0.1', 'v1.0.2', 'v1.0.3']
data = {'version': [versions] * 3,
        'values': [[10.2, 11.3, 9.5, 10.9],
                   [9.2, 10.4, 9.3, 9.9],
                   [8.2, 10.2, 9.1, 11.1]],
        'columns': ['2x8x8', '2x8x10', '2x8x12'],
        'color': Spectral11[0:3] }

source = ColumnDataSource(data)

p = figure(width = 500, height = 300, x_range = versions)
p.multi_line(xs = 'version',
             ys = 'values',
             color = 'color',
             legend = 'columns',
             line_width = 5,
             source = source)
show(p)

Результат:

enter image description here

1 голос
/ 05 апреля 2019

Я думаю, что это то, что вы хотите (протестировано на Bokeh v1.0.4):

import pandas as pd
import numpy as np
from bokeh.palettes import Spectral11
from bokeh.plotting import figure, show

toy_df = pd.DataFrame(data = {'version': ['v1.0.0', 'v1.0.1', 'v1.0.2', 'v1.0.3'],
                              '2x8x8': [10.2, 11.3, 9.5, 10.9],
                              '2x8x10': [9.2, 10.4, 9.3, 9.9],
                              '2x8x12': [8.2, 10.2, 9.1, 11.1]}, columns = ('version', '2x8x8' , '2x8x10', '2x8x12'))

numlines = len(toy_df.columns)
mypalette = Spectral11[0:numlines]

p = figure(width = 500, height = 300, x_range = toy_df['version'])
p.multi_line(xs = [toy_df['version'].values] * numlines,
             ys = [toy_df[name].values for name in toy_df],
             line_color = mypalette,
             line_width = 5)
show(p)

Результат:

enter image description here

...