Jak přidat animaci do plotly obrázek v Pythonu

0

Otázka

V současné době 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 pro boudning krabic pomocí polygonů. Moste pravděpodobně ne nejvíce efektivní, otevřené pro vylepšení i tam.

Moje otázka je, jak přidat animace a stávající Plotly obrázek? V mém df mám čas sloupec, který by byl vhodný pro to, že (df.Čas). Při animaci je přidán, já jen chci vykreslit polygony pro to razítko.

Aktuální děj bez animace

EDIT: Přidání Dat struct

Tak to nefunguje, když pikle, jak jsem vysvětlil v můj komentář níže. Nicméně pokud jsem změnu třídění podle ObjID místo toho Času, to funguje, ale animace rám není vyřešeno. Chci nejnižší čas na to být první a nejvyšší 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

Nejlepší odpověď

1

Jste neposkytl vzorek údajů. Implicitně jsou definovány údaje rám

Polygon ObjectId ObjClass čas
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

To se předpokládá, že další sloupec ObjectId , který je stejný polygon , který má různé souřadnice pro každý čas

Nejjednodušší způsob, jak vytvořit plotly animovaný obrázek, je použít Plotly Express. Proto restrukturalizaci dat x a y sekvence v datovém dlouho

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

pomocí ukázkových dat

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

Děkuji moc za vaši odpověď! Pomozte med hodně! Nicméně teď mám nový problém. Pomocí příkladu jsem restrukturalizovány můj datovém na dlouhý formát s "Lat" a "Dlouhé" sloupce. Nicméně zdá se, že velmi vybíravý o tom, jak jsem třídit mé údaje. Když jsem se nějak "ObjID" je to práce, ale časová osa je všechno zpackal. Pokud mám seřadit podle "Času" místo toho, timeline je OK, ale pak to pouze pozemky jeden z objektů na časovou hodnotu, i když existuje více.
MartinCB

ty by měly sdílet své datové struktury, takže jsem musel odvodit. Vypadá to, že máte datový rámec s polygony, kde každý polygon má ObjId, že je konstantní v čase / transformace. proto to je, jak jsem strukturovaný vzorek údajů. aktualizace na vaši otázku s head(10) své datovém a budu aktualizovat. To je důvod, proč všechny TAK pokyny na otázky stresu potřebují sdílet data vzorku. Nechci dělat hrozné věci sdílení dat jako obrázek nutit nějaké přispěvatel používat nespolehlivé OCR použít
Rob Raymond

Přidány mé datové struktury výše. Vypadá dost hrozně, ale já doufám, že můžete kopírovat to, aniž by příliš mnoho potíží.
MartinCB

aktualizováno odpověď - úplně jsi mě hodil s ukázkový kód pomocí urostlý. Zdá se, že váš kód vzorku a vzorku dat jsou nesouvisející
Rob Raymond

Hehe to je proto, že jsem změnil můj Urostlý Polygon přístup, aby blíže odpovídaly vaší odpověď. Původní data má obsahovat Polygonové objekty, ale ty jsem vynechala, když se snaží přizpůsobit mým df, aby váš příklad.
MartinCB

ok - myslím, že nechat jako polygony je lepší..., že bude podporovat 3,4,5, atd oboustranné polygony. klíčové je vyřešit to, než vybuchující to
Rob Raymond

V jiných jazycích

Tato stránka je v jiných jazycích

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