plotly / plotly/plotly.js

Performance issues with many traces compared to single traces

Abierto
#7,489 1 comentario 0 reacciones 1 asignado Ver en GitHub

Nadie ha tomado este issue todavía.

cs P1
Lenguaje dominante
JavaScript
Estrellas
18.3k
Forks
2k
Merge medio
2 d 12 h
PR fusionados (30 d)
28

Descripción

Today, Plotly.js starts to stumble when generating charts with many traces, even if the total number of points is the same. This is a Python example but I believe it boils down to plotly.js.

The performance difference is stark (M4 MacBook Air):

python 100k_traces_1_point_each.py 
=== Testing 100k traces with 1 point each ===
Generating data for 100k traces with 1 point each...
Data generation took: 8.78 seconds
Creating plot...
Plot creation took: 2.47 seconds
Total time: 11.25 seconds

=== Testing 1 trace with 100k points ===
Generating data for 1 trace with 100k points...
Data generation took: 0.00 seconds
Creating plot...
Plot creation took: 0.55 seconds
Total time: 0.55 seconds

Reproduce:

import plotly.graph_objects as go
import numpy as np
import time

def test_100k_traces_1_point():
    print("=== Testing 100k traces with 1 point each ===")
    print("Generating data for 100k traces with 1 point each...")
    start_time = time.time()

    traces = []
    for i in range(100000):
        traces.append(go.Scatter(
            x=[np.random.rand()],
            y=[np.random.rand()],
            mode='markers',
            name=f'Trace {i}',
            showlegend=False
        ))

    data_gen_time = time.time() - start_time
    print(f"Data generation took: {data_gen_time:.2f} seconds")

    fig = go.Figure(data=traces)
    fig.update_layout(
        title="100k Traces - 1 Point Each (100k total points)",
        xaxis_title="X Axis",
        yaxis_title="Y Axis"
    )

    print("Creating plot...")
    start_time = time.time()
    fig.show()
    plot_time = time.time() - start_time
    print(f"Plot creation took: {plot_time:.2f} seconds")
    print(f"Total time: {data_gen_time + plot_time:.2f} seconds")

def test_1_trace_100k_points():
    print("\n=== Testing 1 trace with 100k points ===")
    print("Generating data for 1 trace with 100k points...")
    start_time = time.time()

    x_data = np.random.rand(100000)
    y_data = np.random.rand(100000)

    data_gen_time = time.time() - start_time
    print(f"Data generation took: {data_gen_time:.2f} seconds")

    trace = go.Scatter(
        x=x_data,
        y=y_data,
        mode='markers',
        name='Single Trace - 100k Points',
        marker=dict(size=2)
    )

    fig = go.Figure(data=[trace])
    fig.update_layout(
        title="1 Trace - 100k Points",
        xaxis_title="X Axis",
        yaxis_title="Y Axis"
    )

    print("Creating plot...")
    start_time = time.time()
    fig.show()
    plot_time = time.time() - start_time
    print(f"Plot creation took: {plot_time:.2f} seconds")
    print(f"Total time: {data_gen_time + plot_time:.2f} seconds")

if __name__ == "__main__":
    test_100k_traces_1_point()
    test_1_trace_100k_points()

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.