Ako pridať animáciu na plotly obrázok v jazyku Python

0

Otázka

V súčasnej dobe mám tento kód:

fig= go.Figure()
for idx in range(len(reference)):
    df = reference.loc[idx]
    if df.ObjClass != 0:
        x,y = df.Polygon.exterior.xy
        fig.add_trace(go.Scatter(x=np.array(x), y=np.array(y)))
return fig

Na pozemku je pre boudning políčkami mnohouholníky. Moste pravdepodobne nie je veľmi efektívna, otvorená pre zlepšenie aj tam.

Moja otázka je, ako môžete pridať animáciu a existujúcich Plotly obrázok? V mojom df mám čas stĺpec, ktoré by boli vhodné pre ktoré (df.Čas). Keď animácie je pridaná v, chcem iba pozemok mnohouholníkov na tento čas.

Aktuálne pozemku bez animácie

EDIT: Pridanie Údajov struct

Tak to nefunguje, keď pustila, ako som to vysvetlil v mojom komentár nižšie. Avšak, ak som zmena triedenie podľa ObjID namiesto toho Času, je to práca, ale animácie rám nie je zoradený. Chcem najnižšiu čas byť prvý a najvyšší na konci.

ObjClass    Time    ObjID   Corner  Lat Long
0   3.0 5.9 54.0    RR  21.549906   129.418088
563 3.0 5.9 54.0    LR  23.569243   129.523022
1126    3.0 5.9 54.0    LF  23.569243   136.523022
1689    3.0 5.9 54.0    RF  21.549906   136.418088
1   3.0 5.95    54.0    RR  17.946687   114.856340
564 3.0 5.95    54.0    LR  19.726662   114.919184
1127    3.0 5.95    54.0    LF  19.726662   121.919184
1690    3.0 5.95    54.0    RF  17.946687   121.856340
2   3.0 6.0 54.0    RR  17.685873   121.115523
565 3.0 6.0 54.0    LR  19.556310   121.182149
1128    3.0 6.0 54.0    LF  19.556310   128.182149
1691    3.0 6.0 54.0    RF  17.685873   128.115523
3   3.0 6.05    54.0    RR  17.685873   121.115523
566 3.0 6.05    54.0    LR  19.556310   121.182149
1129    3.0 6.05    54.0    LF  19.556310   128.182149
1692    3.0 6.05    54.0    RF  17.685873   128.115523
4   3.0 6.1 54.0    RR  17.375609   127.925362
567 3.0 6.1 54.0    LR  19.322351   127.848100
1130    3.0 6.1 54.0    LF  19.322351   134.848100
1693    3.0 6.1 54.0    RF  17.375609   134.925362
animation pandas plot plotly
2021-11-22 14:07:05
1

Najlepšiu odpoveď

1

Máte nie sú uvedené vzorové údaje. Implicitne ste definované dátové rám

Mnohouholník ObjectId ObjClass čas
MNOHOUHOLNÍK ((58 91, 58 77, 0 73, -0 87, 58 91)) 0 1 00:00
MNOHOUHOLNÍK ((51 102, 58 90, 7 62, 0 74, 51 102)) 0 1 01:00
MNOHOUHOLNÍK ((40 110, 52 101, 18 54, 6 63, 40 110)) 0 1 02:00

Toto sa predpokladá ďalší stĺpec ObjectId , ktoré je rovnaké mnohouholník , ktorý má rôzne súradnice pre každý čas

Najjednoduchší spôsob, ako vytvoriť plotly animovaný obrázok je použitie Plotly Express. Preto reštrukturalizovať, aby sa údaje x a y sekvencie v dlhej dataframe

import io
import pandas as pd
import numpy as np
import plotly.graph_objects as go
import plotly.express as px
import shapely.wkt


df_p = pd.read_csv(io.StringIO("""Polygon,ObjectId,ObjClass,time
"POLYGON ((58 91, 58 77, 0 73, -0 87, 58 91))",0,1,00:00
"POLYGON ((51 102, 58 90, 7 62, 0 74, 51 102))",0,1,01:00
"POLYGON ((40 110, 52 101, 18 54, 6 63, 40 110))",0,1,02:00
"POLYGON ((28 112, 41 109, 30 52, 17 55, 28 112))",0,1,03:00
"POLYGON ((32 29, 20 33, 38 93, 50 89, 32 29))",1,1,00:00
"POLYGON ((45 31, 34 29, 25 91, 36 93, 45 31))",1,1,01:00
"POLYGON ((57 38, 47 32, 13 84, 23 90, 57 38))",1,1,02:00
"POLYGON ((65 50, 58 39, 5 72, 12 83, 65 50))",1,1,03:00
"POLYGON ((1 90, 7 90, 12 48, 6 48, 1 90))",2,1,00:00
"POLYGON ((-7 85, -2 89, 20 53, 15 49, -7 85))",2,1,01:00
"POLYGON ((-13 78, -10 83, 26 60, 23 55, -13 78))",2,1,02:00
"POLYGON ((-15 69, -14 75, 28 69, 27 63, -15 69))",2,1,03:00
"POLYGON ((59 12, 49 18, 84 92, 94 86, 59 12))",3,1,00:00
"POLYGON ((77 11, 65 11, 66 93, 78 93, 77 11))",3,1,01:00
"POLYGON ((94 17, 83 12, 49 87, 60 92, 94 17))",3,1,02:00
"POLYGON ((107 30, 99 21, 36 74, 44 83, 107 30))",3,1,03:00
"POLYGON ((9 29, 3 37, 13 43, 19 35, 9 29))",4,1,00:00
"POLYGON ((12 28, 4 34, 10 44, 18 38, 12 28))",4,1,01:00
"POLYGON ((15 29, 5 31, 7 43, 17 41, 15 29))",4,1,02:00
"POLYGON ((17 32, 8 29, 5 40, 14 43, 17 32))",4,1,03:00"""))

df_p["Polygon"] = df_p["Polygon"].apply(shapely.wkt.loads)

# explode out ploygons to x & y for plotly express
df_plot = (
    df_p["Polygon"]
    .apply(
        lambda p: [{"x": x, "y": y} for x, y in zip(p.exterior.xy[0], p.exterior.xy[1])]
    )
    .explode()
    .apply(pd.Series)
    .join(df_p)
)


px.line(df_plot, x="x", y="y", color="ObjectId", animation_frame="time")

enter image description here

pomocou vzorových údajov

import pandas as pd
import io
import plotly.express as px

df = pd.read_csv(
    io.StringIO(
        """ObjClass    Time    ObjID   Corner  Lat Long
0   3.0 5.9 54.0    RR  21.549906   129.418088
563 3.0 5.9 54.0    LR  23.569243   129.523022
1126    3.0 5.9 54.0    LF  23.569243   136.523022
1689    3.0 5.9 54.0    RF  21.549906   136.418088
1   3.0 5.95    54.0    RR  17.946687   114.856340
564 3.0 5.95    54.0    LR  19.726662   114.919184
1127    3.0 5.95    54.0    LF  19.726662   121.919184
1690    3.0 5.95    54.0    RF  17.946687   121.856340
2   3.0 6.0 54.0    RR  17.685873   121.115523
565 3.0 6.0 54.0    LR  19.556310   121.182149
1128    3.0 6.0 54.0    LF  19.556310   128.182149
1691    3.0 6.0 54.0    RF  17.685873   128.115523
3   3.0 6.05    54.0    RR  17.685873   121.115523
566 3.0 6.05    54.0    LR  19.556310   121.182149
1129    3.0 6.05    54.0    LF  19.556310   128.182149
1692    3.0 6.05    54.0    RF  17.685873   128.115523
4   3.0 6.1 54.0    RR  17.375609   127.925362
567 3.0 6.1 54.0    LR  19.322351   127.848100
1130    3.0 6.1 54.0    LF  19.322351   134.848100
1693    3.0 6.1 54.0    RF  17.375609   134.925362"""
    ),
    sep="\s+",
    engine="python",
)

# if polygon is a quadrangle, need five points to define it. 4 is just a linestring
# duplicate first corner
df = pd.concat([df, df.loc[df["Corner"].eq("RR")].assign(Corner="RR2")])

# need to sort by Corner, hence make it a categorical
df["Corner"] = pd.Categorical(
    df["Corner"], ["RR", "RF", "LF", "LR", "RR2"], ordered=True
)

px.line(
    df.sort_values(["ObjID", "Time", "Corner"]),
    x="Long",
    y="Lat",
    color="ObjID",
    animation_frame="Time",
).update_layout(
    xaxis={"range": [df["Long"].min(), df["Long"].max()]},
    yaxis={"range": [df["Lat"].min(), df["Lat"].max()]},
)
2021-12-03 15:41:12

Ďakujem veľmi pekne za vašu odpoveď! Pomôcť med veľa! Avšak teraz mám nový problém. Pomocou váš príklad som reštrukturalizované moje dataframe na dlhý formát s "Lat" a "Dlhé" stĺpce. Avšak zdá sa, veľmi vyberavý, ako som triediť dáta. Ak som zoradiť podľa "ObjID" to prácu, ale na časovej osi je všetko skazil. Ak som zoradiť podľa "Čas" namiesto toho, časová os je OK, ale potom to len pozemky jedného z objektov na hodnotu času, aj keď existuje viacero.
MartinCB

máte nezdieľa vaše údaje štruktúru tak som musel konštatovať, že. Vyzerá to, ako by si mal údajov rám s mnohouholníky, kde každý mnohouholník má ObjId, že je konštantná cez čas / transformácie. preto, že je, ako som štruktúrovaný vzorové údaje. aktualizácia vaša otázka head(10) vaše dataframe a budem aktualizovať. To je dôvod, prečo je všetko TAK, pokyny na kladenie otázok zdôrazniť potrebu podeliť sa vzorové údaje. Nerobia to hrozná vec z zdieľanie dát ako obrázok núti všetky answerer používať nespoľahlivé OCR ju používať
Rob Raymond

Pridané moje dátové štruktúry vyššie. Vyzerá trochu hrozné, ale ja dúfam, že je možné ho kopírovať bez príliš veľa ťažkostí.
MartinCB

aktualizované odpoveď - úplne hodil ma s vzorka kódu pomocou urastený. Zdá sa, váš kód vzorky a vzorky údajov nesúvisia
Rob Raymond

Hehe je to preto, že som sa zmenil až mi Urastený Mnohouholník prístup k užšej zápas vašu odpoveď. Pôvodné údaje neobsahuje Mnohouholník objekty, ale nechal som tie, keď sa snaží prispôsobiť moje df, aby sa váš príklad.
MartinCB

áno, myslím si, že dochádzky ako mnohouholníky je lepšie... že bude podporovať 3,4,5, atď stranný mnohouholníky. kľúč je vyriešiť to pred vybuchujúce to
Rob Raymond

V iných jazykoch

Táto stránka je v iných jazykoch

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................