Интерактивный график Pandas Data-frame Цветовое кодирование на основе группы из столбца - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть пример кадра данных pandas следующим образом:

      day  id     cnt
      2   catx     4
      2   kagm     3
      2   dyrt     5
      3   catx     3
      3   kagm     3
      3   dyrt     4
      5   catx     2
      5   kagm     2
      5   dyrt     2  

Я хочу построить график разброса данных cnt (y) в зависимости от дня (x), где точки будут помечены (цветные /легенда) на основе столбца идентификатора .

Теперь это довольно просто в seaborn / matplotlib, который, как я знаю, можно построить, а график можно сохранить в файл.

Тем не менее, я ищу интерактивный сюжет с использованием plotly / bokeh / d3 / mp3ld и т. Д. И, наконец, поместите этот сюжет в URL (по моему выбору или, возможно, в аккаунте, основанном на).Моя цель также состоит в том, чтобы иметь функцию наведения, которая будет показывать мне значение точек, когда я наведу курсор на определенную точку курсора.

Я пробовал использовать bokeh / plotly с запонками, используя ColumnDataSource и все, чтобы попытаться получить графики.Тем не менее, не удалось получить ничего, что я ищу.Могу ли я получить помощь в этом направлении от экспертов?Спасибо в ожидании.

1 Ответ

0 голосов
/ 11 февраля 2019

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

#!/usr/bin/python3

import pandas as pd
from bokeh.models import ColumnDataSource
from bokeh.palettes import all_palettes
from bokeh.plotting import figure, output_file, show

data = {'day': [2, 2, 2, 3, 3, 3, 5, 5, 5], 'id': ['catx', 'kagm', 'dyrt', 'catx', 'kagm', 'dyrt', 'catx', 'kagm', 'dyrt'], 'cnt': [4, 3, 5, 3, 3, 4, 2, 2, 2]}
df = pd.DataFrame.from_dict(data)

output_file('plot.html')
tooltips = [
    ("day", "@day"),
    ("id", "@$name"),
    ("count", "@cnt")]
p = figure(tooltips=tooltips, plot_width=800, plot_height=800)

sources = []
colors = all_palettes['Viridis'][len(set(df['id'].tolist()))]
pd.options.mode.chained_assignment = None #Supress false positive warning
for ID, color in zip(set(df['id'].tolist()), colors):
    dfSubset = df.loc[df['id'] == ID]
    dfSubset['color'] = color
    sources.append(ColumnDataSource(dfSubset))
    p.circle(x = 'day', y = 'cnt', legend = 'id', color = 'color', name = 'id', alpha = 0.5, size = 15, source = sources[-1])

p.legend.click_policy="hide"

show(p)

plot

...