2

I am trying to render a large dataset with plotly. I am plotting a temperature and depth line. When the number of data points is ~100,000 it is unusably slow. However when it has ~85,000 points it works fine.

The reason this is so weird is because having 4 lines with ~85,000 points works really fast still. Even though there is way more data being plotted.

Why is there such a performance discrepancy?

TLDR: Having 4 lines with ~85,000 points is significantly faster than having 2 lines with ~100,000 points.

Here is a sandbox to test it. Try changing increment from 0.07 to 0.06 to see what I mean. Even when only plotting 1 or 2 lines it is still slow.
https://stackblitz.com/edit/react-ts-4fteps?file=index.tsx

import { Col } from 'react-bootstrap';
import Plot from 'react-plotly.js';
import { useState, useEffect } from 'react';

const LinePlot: React.FC = () => {
    const [depthDataPoints, setDepthDataPoints] = useState<number[]>([]);
    const [temperatureDataPoints, setTemperatureDataPoints] = useState<number[]>([]);
    
    const [depthDataPoints2, setDepthDataPoints2] = useState<number[]>([]);
    const [temperatureDataPoints2, setTemperatureDataPoints2] = useState<number[]>([]);

    useEffect(() => {
        // Generate data points for the depth line (0 to 6000 at every 0.01 increment)
        const increment = 0.07;
        const depthPoints = Array.from({ length: Math.ceil(6000 / increment) + 1 }, (_, i) => i * increment);
        setDepthDataPoints(depthPoints);
        setDepthDataPoints2(depthDataPoints.map(y => y * 0.5))

        // Generate data points for the temperature line (fluctuating from 102 F to 165 F)
        const temperaturePoints = depthPoints.map(() => 102 + Math.random() * (165 - 102));
        setTemperatureDataPoints(temperaturePoints);
        setTemperatureDataPoints2(temperatureDataPoints.map(y => y * 2));
    }, []);

    return (
        <Col sm={10}>
            <Plot
                data={[
                    {
                        x: depthDataPoints,
                        y: depthDataPoints,
                        type: 'scattergl',
                        mode: 'lines',
                        name: 'Depth (ft)',
                        line: { color: 'blue' },
                    },
                    {
                        x: depthDataPoints,
                        y: temperatureDataPoints,
                        type: 'scattergl',
                        mode: 'lines',
                        name: 'Temperature (°F)',
                        line: { color: 'red' },
                    },
                    {
                        x: depthDataPoints,
                        y: depthDataPoints2,
                        type: 'scattergl',
                        mode: 'lines',
                        name: 'Depth 2 (ft)',
                        line: { color: 'green' },
                    },
                    {
                        x: depthDataPoints,
                        y: temperatureDataPoints2,
                        type: 'scattergl',
                        mode: 'lines',
                        name: 'Temperature 2 (°F)',
                        line: { color: 'orange' },
                    },
                ]}
                layout={{
                    title: 'Depth and Temperature Plot',
                    xaxis: { title: 'Depth (ft)', range: [0, 6000] },
                    yaxis: { title: 'Measurement', autorange: true },
                    autosize: true,
                }}
                useResizeHandler={true}
                style={{ width: '100%' }}
                config={{ responsive: true }}
            />
        </Col>
    );
};

export default LinePlot;

1 Answer 1

1

As strange as it may sound, it works fine when using type: 'scatter' instead of type: 'scattergl', while scattergl is supposed to be faster when having many data points.

Switching mode from 'lines' to 'markers' produces the same behavior.

This performance discrepancy is likely due to a bug in the scattergl implementation. You might want to reopen this issue.

Sign up to request clarification or add additional context in comments.

1 Comment

Wow you are right. Thank you!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.