Cómo agregar animación a plotly figura en Python

0

Pregunta

Actualmente tengo este código:

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 parcela es de boudning cajas con polígonos. Moste probablemente no el más eficiente, abierto para mejoras de la misma.

Mi pregunta es cómo agregar una animación y existentes Plotly de la figura? En mi df tengo una columna de tiempo que sería adecuado para que (df.De tiempo). Cuando la animación se agrega en el, solo quiero trazar los polígonos para que la marca de tiempo.

Actual de la parcela, sin animación

EDIT: la Adición de Datos struct

Así que esto no funciona cuando se trazan, como explico en mi comentario de abajo. Sin embargo, si me cambio a la clasificación por ObjID en lugar de Tiempo, se hace el trabajo, pero el fotograma de la animación no está ordenada. Quiero que el tiempo mínimo para ser el primero y más alto al final.

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

Mejor respuesta

1

Usted no ha proporcionado datos de la muestra. Implícitamente está definido un marco de datos

Polígono ObjectId ObjClass tiempo
POLÍGONO ((58 91, 58 77, 0 73, -0 87, 58 91)) 0 1 00:00
POLÍGONO ((51 102, 58 90, 7 62, 0 74, 51 102)) 0 1 01:00
POLÍGONO ((40 110, 52 101, 18 54, 6 63, 40 110)) 0 1 02:00

Esto ha asumido una columna adicional ObjectId que es el mismo polígono que tiene diferentes coordenadas para cada momento

Manera más sencilla de crear un plotly de animación de la figura es el uso Plotly Express. Por lo tanto reestructurar datos x y y secuencias en un largo 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

utilizando datos de la muestra

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

Muchas gracias por tu respuesta! Ayuda med mucho! Sin embargo, ahora tengo un nuevo problema. Usando tu ejemplo, he reestructurado mi dataframe a un formato largo con "Lat" y "Largo" de las columnas. Sin embargo parece ser muy exigente en ¿cómo puedo ordenar mis datos. Si puedo ordenar por "ObjID" que funcione, pero la línea de tiempo está todo desordenado. Si puedo ordenar por "Tiempo" en su lugar, la línea de tiempo está bien, pero entonces sólo parcelas de uno de los objetos por valor de tiempo, a pesar de que hay varios.
MartinCB

usted no ha compartido su estructura de datos, así que tuve para inferir de ella. Parece que tiene una trama de datos con polígonos donde cada polígono tiene un ObjId que es constante a través del tiempo / transformaciones. por lo tanto eso es lo que me estructurado de datos de ejemplo. actualización de su pregunta con head(10) de su dataframe y yo voy a actualizar. Esta es la razón por la que todos LO directrices sobre preguntas estrés necesidad de compartir datos de la muestra. No hacer la cosa horrible de compartir sus datos como una imagen obligar a cualquier usuario a utilizar poco confiable OCR para usarlo
Rob Raymond

Añadido a mi estructura de datos anterior. Se ve un poco horrible, pero yo espero que usted puede copiar sin demasiados problemas.
MartinCB

respuesta actualizada - completamente me tiró con el código de ejemplo usando bien formada. Parece que tu código de ejemplo y muestra de datos no están relacionados
Rob Raymond

Jeje que es porque he cambiado mi bien formada Polígono enfoque más partido de su respuesta. Los datos originales no incluye el Polígono de objetos, pero me abandonó cuando tratando de adaptar mi df con su ejemplo.
MartinCB

ok, creo que dejando como polígonos es mejor... que apoyará 3,4,5, etc caras de los polígonos. la clave es que antes de la explosión
Rob Raymond

En otros idiomas

Esta página está en otros idiomas

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