Интерактивный Plotly Int Slider - PullRequest
0 голосов
/ 10 мая 2018

Привет, я довольно новичок в Python, Plotly и Jupyter Notebook.Я хотел бы использовать ползунок, чтобы выбрать количество дней в качестве диапазона в запросе, из которого создается график.Моя единственная проблема заключается в том, что я хочу, чтобы график автоматически обновлялся при взаимодействии со слайдером, без необходимости повторного запуска запроса и создания графика.Мой код ниже:

slider = widgets.IntSlider()
display(slider)
sliderVal = slider.value

df = pd.read_sql(f"""
SELECT CASE WHEN SiteID LIKE 3 THEN 'BLAH' 
        WHEN SiteID LIKE 4 THEN 'BLAHBLAH' 
        END AS Website, 
        COUNT(1) AS Count
FROM            viewName
WHERE        (TimeStamp > DATEADD(DAY, -{sliderVal}, GETDATE()))
GROUP BY SiteId
ORDER BY Count DESC
           """, conn)

data = [go.Bar(x=df.Website, y=df.Count)]
layout = go.Layout(
    xaxis=dict(
        title='Website'),
    yaxis=dict(
        title='Exception count'),
    title=f'Number of exceptions per user in the last {sliderVal} days')
chart = go.Figure(data=data, layout=layout, )
py.iplot(chart, filename='WebExceptions')

Заранее спасибо!

1 Ответ

0 голосов
/ 13 мая 2018

Если вы не хотите перезапускать запрос, то ваш фрейм данных df должен содержать результаты для всех значений, которые вы хотите использовать для виджета intslider, тогда функция, связанная с виджетом, просто отфильтрует данные и перерисовать график с новыми отфильтрованными данными.

Вот пример с некоторыми фиктивными данными:

import ipywidgets as widgets
import plotly.offline as py
import plotly.graph_objs as go
import pandas as pd
py.init_notebook_mode(connected = True)

# Dummy data, to be replaced with your query result for the range of sliderVal
df = pd.DataFrame({'Days': [1] * 3 + [2] * 4 + [3] * 5,
                  'Website': [1,2,3, 4,5,6,7, 8,9,10,11,12],
                  'Count': [10,5,30, 15,20,25,12, 18,17,30,23,27]})

def update_plot(sliderVal):
    filtered_df = df.query('Days== ' + str(sliderVal))
    data = [go.Bar(x = filtered_df.Website,
                   y = filtered_df.Count)]
    layout = go.Layout(
        xaxis = dict(title = 'Website'),
        yaxis = dict(title = 'Exception count'),
        title = f'Number of exceptions per user in the last {sliderVal} days')
    chart = go.Figure(data = data, layout = layout, )
    py.iplot(chart, filename = 'WebExceptions')

# links an IntSlider taking values between 1 and 3 to the update_plot function
widgets.interact(update_plot, sliderVal = (1, 3))

и вот результат с sliderVal = 2:

enter image description here

...