Holoviews Hovertool показать лишний ряд? - PullRequest
1 голос
/ 06 января 2020

У меня есть набор данных, в котором я хочу построить графики с 2 разными переменными на оси X (в 2 различных графиках), но я хочу получить другое значение в Hovertool

from io import StringIO
import pandas as pd

data = """,item_id,start,station,rejects
0,item1,2019-10-14 19:00:00,assembly,4.297994269340974
1,item1,2019-10-14 19:00:00,ST1,0.20546537908362442
2,item1,2019-10-14 19:00:00,ST2,0.494539460127756
3,item1,2019-10-14 19:00:00,ST3,0.6892230576441103
4,item2,2019-10-14 23:30:00,assembly,4.432249894470241
5,item2,2019-10-14 23:30:00,ST1,0.19071837253655435
6,item2,2019-10-14 23:30:00,ST2,0.7651434643995749
7,item2,2019-10-14 23:30:00,ST3,0.7748600947051227
8,item3,2019-10-15 04:00:00,assembly,3.55576079427384
9,item3,2019-10-15 04:00:00,ST1,0.37002775208140615
10,item3,2019-10-19 04:00:00,ST2,0.7195914577530177
11,item3,2019-10-19 04:00:00,ST3,0.492379835873388
12,item4,2019-10-19 10:30:00,assembly,4.02656704026567
13,item4,2019-10-19 10:30:00,ST1,0.22926219258024177
14,item4,2019-10-19 10:30:00,ST2,0.690376569037657
15,item4,2019-10-19 10:30:00,ST3,0.838745695410320"""

data_reduced = pd.read_csv(StringIO(data), parse_dates=["start"], index_col=0)

Я хочу создать график с item_id на оси X и датой start на оси X. Я хочу отслеживать отклонения для каждой станции и комбинации сборки.

import holoviews as hv
import bokeh
from holoviews import opts
hv.extension('bokeh')
bokeh.plotting.output_notebook()

def plot(data_reduced, x_axis="item_id"):
    x_label = x_axis if x_axis in {"start", "item_id"} else "item_id"
    key_dimensions = [(x_label, x_label), ("station", "station")]
    value_dimensions = [
        ("rejects", "rejects"),
        ("start", "start"),
        ("item_id", "item_id"),
        ("start", "start"),
    ]

    datatable = hv.Table(
        data_reduced, kdims=key_dimensions, vdims=value_dimensions
    )
    scatter_plot = datatable.to.scatter(x_label, ["rejects"])
    overlay = scatter_plot.overlay("station")

    tooltips = [
        ("item_id", "@item_id"),
        ("start", "@start{%Y-%m-%d %H:%M}"),
        ("station", "@station"),
        ("rejects", "@rejects"),
    ]
    hover = bokeh.models.HoverTool(
        tooltips=tooltips, formatters={"start": "datetime"}
    )

    return overlay.opts(
        opts.Scatter(
            color=hv.Cycle("Category10"),
            show_grid=True,
            padding=0.1,
            height=400,
            tools=[hover],
        ),
        opts.NdOverlay(
            legend_position="right", show_frame=False, xrotation=90
        ),
    )

И затем я делаю графики с помощью plot(data_reduced, x_axis="start") или plot(data_reduced, x_axis="item_id")

plot(data_reduced, x_axis="start")

data plotted with start on x-axis

plot(data_reduced, x_axis="item_id")

enter image description here

Как получить ??? заполнено?

Если я хочу получить данные из отдельной строки (list(p.items())[0][1].data), я получаю:

,item_id,start,station,rejects
1,item1,2019-10-14 19:00:00,ST1,0.2054653790836244
5,item2,2019-10-14 23:30:00,ST1,0.19071837253655435
9,item3,2019-10-15 04:00:00,ST1,0.37002775208140615
13,item4,2019-10-19 10:30:00,ST1,0.22926219258024175

Таким образом, данные, похоже, находятся в источнике

1 Ответ

1 голос
/ 08 января 2020

В подобных случаях я предпочитаю использовать hvplot , которая является библиотекой, построенной на основе holoviews, созданной той же группой разработчиков. Это действительно делает жизнь, я думаю, намного проще и создает ваш сюжет в одном go.

1) С Hvplot вы можете легко указать дополнительные столбцы при наведении курсора с ключевым словом hover_cols = ['your_column ']:

# with this import you can use .hvplot() on your df and create interactive holoviews plots
import hvplot.pandas

item_plot = data_reduced.hvplot(
    kind='scatter',
    x='item_id',
    y='rejects',
    by='station',  # this creates the overlay
    hover_cols=['start'],
    padding=0.1,
)

start_plot = data_reduced.hvplot(
    kind='scatter',
    x='start',
    y='rejects',
    by='station',
    hover_cols=['item_id'],
    padding=0.1,
)


2) Если вам нужно решение pure Holoviews , вы можете сделать:

import holoviews as hv
from holoviews import opts

hv_df = hv.Dataset(
    data_reduced,
    kdims=['item_id', 'station'], 
    vdims=['rejects', 'start'],
)

hv_df.to(hv.Scatter).overlay().opts(opts.Scatter(tools=['hover']))


Пример графика с дополнительными столбцами при наведении:

using hvplot to create plot overlay with extra hover columns

...