【问题标题】:Plotly - Slider grouping by datePlotly - 按日期分组的滑块
【发布时间】:2021-05-01 07:15:33
【问题描述】:

所以我有一个包含 3 列的表:延迟、提示值和日期

这是它的样子:

+------------+----------+----------+
|    delay   |tips_value|      date|
+------------+----------+----------+
|  -15 to -30|       2.0|2021-01-01|
|  -15 to -30|       2.0|2021-02-16|
|  -30 to -45|       5.0|2021-01-27|
|  -15 to -30|      10.0|2021-04-05|
|  -15 to -30|       2.0|2021-02-01|
|   00 to  15|       2.0|2021-01-01|
|   00 to  15|       5.0|2021-03-07|
|   75 to  90|       2.0|2021-01-23|
|  -15 to -30|       2.0|2021-02-09|
|  -45 to -60|      10.0|2021-04-18|
+------------+----------+----------+

delay 是一个有 14 个可能值的字符串,应该是我的 x 轴 Tips_value,我的 y 轴,有 3 个可能的值,我想 count() 它按延迟分组,但将此计数限制为天数,默认使用向后 7 天的滑块选择。 因此,我想通过滑块选择我看到多少天的数据。

所以这将是一个图表“延迟提示值”,当我滑动我正在查看的天数时,它会改变值,如下面的草图(试图)表示的那样

老实说,我不知道我是怎么做的,很容易看到我的 x = df['delay'] 但我不知道如何在 y 更改时声明它。 我正在查看许多关于 plotly 的滑块示例,但我找不到在您滑动时对数据进行分组和更改的示例。请大家帮忙看看好吗?

【问题讨论】:

  • 您确定pyspark 是正确的标签吗?您的数据可能不是来自 Pandas 数据框吗?
  • @werner 对不起,你是对的。我会改的,谢谢。

标签: pandas dataframe plotly plotly-python


【解决方案1】:
  • 滑块正在使用dash
  • 回调days 到数据框过滤器,然后构建 plotly figure
  • 我的运行环境是 jupyterlab,常见问题解答涵盖其他运行环境
  • 几天前我从现在开始编码,因此示例数据已将默认设置为 100 天
import pandas as pd
import plotly.graph_objects as go
from jupyter_dash import JupyterDash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
import io

# use sample data
df = pd.read_csv(io.StringIO("""|    delay   |tips_value|      date|
|  -15 to -30|       2.0|2021-01-01|
|  -15 to -30|       2.0|2021-02-16|
|  -30 to -45|       5.0|2021-01-27|
|  -15 to -30|      10.0|2021-04-05|
|  -15 to -30|       2.0|2021-02-01|
|   00 to  15|       2.0|2021-01-01|
|   00 to  15|       5.0|2021-03-07|
|   75 to  90|       2.0|2021-01-23|
|  -15 to -30|       2.0|2021-02-09|
|  -45 to -60|      10.0|2021-04-18|
"""), sep="\s*\|\s*", engine="python", parse_dates=["date"]).pipe(lambda d: d.drop(columns=[c for c in d.columns if "Unnamed" in c]))

# Build App
app = JupyterDash(__name__)
app.layout = html.Div([
    dcc.Graph(id='graph'),
    dcc.Slider(id='days-slider',min=1,max=400,step=20,value=100,
               marks={1: '1 day',200: '200 days',400: '400 days',},
    ),
    html.Div(id='days-slider-output'),
])
# Define callback to update graph
@app.callback(
    Output('graph', 'figure'),
    [Input('days-slider', 'value')])
def update_figure(days):
    # use slider value to filter data, then structure it to make generating traces simple
    dfc = (df.loc[df["date"].ge(pd.to_datetime("now")-pd.Timedelta(days=days))]
           .groupby(["delay","tips_value"]).count()
           .unstack("tips_value").droplevel(0,axis=1).fillna(0))
    fig = go.Figure(data=[go.Scatter(x=dfc.index, y=dfc[c], name=c) for c in dfc.columns])
    return fig.update_layout(title=f"{days} days")

# Run app and display result inline in the notebook
app.run_server(mode='inline')

【讨论】:

    猜你喜欢
    • 2018-12-06
    • 2020-03-12
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 2021-09-30
    • 2012-05-28
    相关资源
    最近更新 更多