plotly 中的 Avg-min-max 图表

Avg-min-max chart in plotly

我正在使用基于 Microsoft Excel 生成的一些图的 plotly dash 构建一个筛选器。其中一个图表是 Avg-max-min,下面是此类图表的示例。

我不知道如何将这种图表“翻译”成情节图,到目前为止我已经尝试过了,但没有成功:

fig = go.Figure(data=go.Scatter(
        x=[0, 1, 2],
        y=[6, 10, 2],
        error_y=dict(
            type='data', # value of error bar given in data coordinates
            array=[1, 2, 3],
            visible=True)
    )) 

我认为我已经非常接近真正的解决方案,基本上是在没有线条的情况下绘制误差线图。

在我看来,除非您对 box plots 感到满意,否则似乎没有预建函数可以这样做。

数据

import pandas as pd
import plotly.graph_obj as go

df = pd.DataFrame({"x": [0, 0, 0, 1, 1, 2],
                   "y":[1,2,4, 1, 10, 4]})

# here I calculate min, max and mean for every x
grp = df.groupby("x").agg({"y":{"min", "max", "mean"}})
grp.columns =  ["_".join(col) for col in grp.columns]
grp = grp.reset_index()

情节

fig = go.Figure()
# first I add a trace for every x
fig.add_trace(go.Scatter(x=grp["x"],
                         y=grp["y_min"],
                         mode="markers",
                         showlegend=False,
                         marker=dict(color="blue",
                                     size=10)))

fig.add_trace(go.Scatter(x=grp["x"],
                         y=grp["y_mean"],
                         mode="markers",
                         showlegend=False,
                         marker=dict(color="blue",
                                     size=20)))

fig.add_trace(go.Scatter(x=grp["x"],
                         y=grp["y_max"],
                         mode="markers",
                         showlegend=False,
                         marker=dict(color="blue",
                                     size=10)))
# then I add a vertical line for 
# every x where y_min!=y_max
for i, row in grp.iterrows():
    if row["y_min"]!=row["y_max"]:
        fig.add_shape(
            dict(type="line",
                 x0=row["x"],
                 x1=row["x"],
                 y0=row["y_min"],
                 y1=row["y_max"],
                 line=dict(
                   color="blue",
                   width=2)
                )
        )
fig.update_layout(title="Avg-Max-Min Graph", title_x=0.5)
fig.show()