Come aggiungere animazioni alle plotly figura in Python

0

Domanda

Attualmente ho questo codice:

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

La trama è per boudning caselle di poligoni. Moste probabilmente non è il più efficiente, aperto a miglioramenti lì.

La mia domanda è: come aggiungere un'animazione e l'esistente Plotly figura? Nel mio df ho una colonna di tempo che sarebbe adatto per che (df.Il tempo). Quando l'animazione è aggiunto, voglio solo tracciare i poligoni per il timestamp.

Grafico corrente senza animazione

EDIT: Aggiunta di Dati struct

Quindi questo non funziona quando il tracciato, come spiego nel mio commento qui sotto. Tuttavia in caso di cambio di ordinamento ObjID invece di Tempo, funziona, ma il frame dell'animazione non è ordinato. Voglio il tempo minimo per essere il primo e più alto alla fine.

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

Migliore risposta

1

Non hanno fornito i dati di esempio. Implicitamente si è definito un frame di dati

Poligono ObjectId ObjClass tempo
POLIGONO ((58 91, 58 77, 0 73, -0 87, 58 91)) 0 1 00:00
POLIGONO ((51 102, 58 90, 7 62, 0 74, 51 102)) 0 1 01:00
POLIGONO ((40 110, 52 101, 18 54, 6 63, 40 110)) 0 1 02:00

Questo ha assunto una colonna aggiuntiva ObjectId che è lo stesso poligono che ha coordinate diverse per ogni tempo

Modo più semplice per creare un plotly figura animata è utilizzare Plotly Express. Quindi ristrutturare di dati x e y sequenze in un lungo 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

utilizzando i dati di esempio

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

Grazie mille per la tua risposta! Aiuto med fuori un sacco! Tuttavia ora ho un nuovo problema. Usando il tuo esempio, ho ristrutturato il mio dataframe per un lungo formato con "Lat" e "Lungo" colonne. Tuttavia sembra molto preciso su come ordinare i miei dati. Se mi ordina ObjID" è il lavoro ma la timeline è tutto incasinato. Se io ordinare da "il Tempo", invece, la linea temporale è OK, ma allora è solo trame uno degli oggetti per il valore di tempo, anche se ci sono più.
MartinCB

non hai mai condiviso i dati della tua struttura ho avuto modo di inferire. Sembra che si dispone di un frame di dati con i poligoni dove ogni poligono ha un ObjId che è costante nel tempo / trasformazioni. quindi, ecco come sono strutturati i dati di esempio. aggiorna la tua domanda con head(10) del tuo dataframe e ti aggiorna. Questo è il motivo per cui tutte COSÌ le linee guida sulle domande di stress necessità di condividere i dati di esempio. Non fare la cosa orribile di condivisione dei dati di immagine, costringendo qualsiasi risposto di utilizzare inaffidabili OCR per usarlo
Rob Raymond

Aggiunto i miei dati struttura di cui sopra. Sembra un po ' orribile, ma io speriamo che si può copiare senza troppi problemi.
MartinCB

aggiornato risposta - è completamente mi gettò con codice di esempio utilizza formosa. Appare il codice di esempio e i dati di esempio sono estranei
Rob Raymond

Hehe che è perché ho cambiato la mia Formosa Poligono di approccio di corrispondenza più stretta la tua risposta. I dati originali non includono oggetti Poligonali, ma ho perso quelli quando cercando di adattare il mio df per il tuo esempio.
MartinCB

ok, penso di lasciare come poligoni è meglio... che sarà di supporto 3,4,5, ecc lati dei poligoni. chiave di ordinamento prima di esplodere si
Rob Raymond

In altre lingue

Questa pagina è in altre lingue

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