Buduję przesiewacza za pomocą Plotly Dash na podstawie niektórych działek generowanych przez Microsoft Excel. Jednym z tych wykresów jest AVG-max-min, poniżej przykład tego typu wykresu.

ly

Nie mam pojęcia, jak "przetłumaczyć" tego rodzaju wykresu na figurę, próbowałem tego do tej pory, ale nie udało mi się:

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)
    )) 

Myślę, że jestem naprawdę blisko prawdziwego rozwiązania, jest zasadniczo wykonywanie wykresy ekranu bez linii.

0
Occhima 31 lipiec 2020, 22:01

1 odpowiedź

Najlepsza odpowiedź

Wygląda mi to nie wydaje mi się, że istnieje funkcja prebuilna, chyba że jesteś zadowolony z Pudełko.

Dane

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()

Wątek

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()

enter image description here

3
rpanai 31 lipiec 2020, 22:32