代码之家  ›  专栏  ›  技术社区  ›  gcpreston

交互式Plotly Int滑块

  •  3
  • gcpreston  · 技术社区  · 7 年前

    嗨,我对Python、Plotly和Jupyter笔记本相当陌生。我想使用一个滑块来选择天数作为创建图表的查询范围。我唯一的问题是,我希望图形在与滑块交互时自动更新,而无需重新运行查询和图形创建。我的代码如下:

    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 回复  |  直到 7 年前
        1
  •  2
  •   byouness    7 年前

    如果不想重新运行查询,则 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