javascript - Plotly.js - gd.data 必须是一个数组

标签 javascript html plotly

我正在使用 Plotly.js 库来绘制 3D 图形。我的计划是将 4 条轨迹绘制到一张 3D 图中。但是当我尝试这样做时,我的网站遇到了一些奇怪的行为。

有时,当我加载网站时,我没有收到任何错误,并且所有 4 条轨迹都完美加载到我的 3D 图中。但在另一次,并非所有跟踪都加载到我的图表中,我收到错误:

Error: gd.data must be an array.

这是我从 CSV 文件添加跟踪的函数:

function addTraceFromCSVdarkColor(divname,link)
{
    Plotly.d3.csv(link, function(err, rows)
    {
        function unpack1(rows, key) 
        {
            return rows.map(function(row) { return row[key]; });
        }        

        var trace1 = {
            x: unpack1(rows, 'x'),
            y: unpack1(rows, 'y'),
            z: unpack1(rows, 'z'),
            mode: 'lines',
            type: 'scatter3d',
            opacity: 0.5,
            line: 
            {
                color: 'rgb(252, 185, 0)',
                size: 2,
                opacity: 0.5
            }
        };

        var data = [trace1];
        Plotly.addTraces(divname,data);
    });
}

这就是我创建 3D 图表的方式:

function print3DMultiGraphMain(divname,link)
{
    Plotly.d3.csv(link, function(err, rows)
    {
        function unpack1(rows, key) 
        {
        return rows.map(function(row) { return row[key]; });
        }        

        var trace1 = {
            x: unpack1(rows, 'x'),
            y: unpack1(rows, 'y'),
            z: unpack1(rows, 'z'),
            mode: 'lines',
            type: 'scatter3d',
            line: 
            {
                color: 'rgb(252, 185, 0)',
                size: 2
            }
        };

        var data = [trace1];
        var layout = {
            autorange: false,
            width: 800,
            height: 800,
            scene: 
            {
                aspectratio: 
                {
                    x: 1,
                    y: 1,
                    z: 1
                },
                x: 0,
                y: 0,
                camera: 
                {
                    center: 
                    {
                        z: 0
                    },
                    eye: 
                    {
                        x: 1.25,
                        y: 1.25,
                        z: 1.25
                    },
                    up: 
                    {
                        x: 0,
                        y: 0,
                        z: 1
                    }
                },
                xaxis: 
                {
                    type: 'linear',
                    range: [0, 200],
                    zeroline: false
                },
                yaxis: 
                {
                    type: 'linear',
                    zeroline: false,
                    range: [0, 200]
                },
                zaxis: 
                {
                    type: 'linear',
                    zeroline: false,
                    range: [0, 200]
                }
            },
        };
        Plotly.newPlot(divname, data, layout,{displayModeBar: false});
    });
}

这就是我在 html 文件中调用函数的方式:

<script>
print3DMultiGraphMain('tester','out1.csv');

addTraceFromCSVlightColor('tester','out2.csv');
addTraceFromCSVdarkColor('tester','out3.csv');
addTraceFromCSVlightColor('tester','out4.csv');
</script>

最佳答案

当包含图表的 div 不具有数组类型的属性 data 时,将会发生错误 gd.data 必须是数组。 这可能是因为当您尝试添加轨迹时,图表尚未正确初始化,例如如果您的异步 MultigraphMain 调用在您的一个 addTrace 调用之后完成。

为了避免这个问题,您必须等待图表创建后再尝试添加跟踪。 Plotly.newPlot() 返回一个 promise 。我在下面附上了一个最小的展示。

var trace1 = {
  x: [1, 2, 3, 4],
  y: [10, 15, 13, 17],
  type: 'scatter'
};

var trace2 = {
  x: [1, 2, 3, 4],
  y: [16, 5, 11, 9],
  type: 'scatter'
};

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function getInitialData() {
  // simulate HTTP call
  await sleep(2000);
  return trace1;
}

getInitialData().then((trace) => {
	Plotly.newPlot('myPlot', [trace]).then(
    () => {
  	  Plotly.addTraces('myPlot', [trace2]);
    }
  );		
})

// if you call addTraces here, it is going to fail
// Plotly.addTraces('myPlot', [trace2]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/plotly.js/1.49.5/plotly.min.js"></script>
<div id="myPlot">
</div>

关于javascript - Plotly.js - gd.data 必须是一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35846210/

相关文章:

javascript - Vanilla JS 相当于 $(nav ul li a).eq[0].attr ('href' )

Python 和 Plotly : custom colors to pie chart via dictionary

JavaScript 重启计数器

javascript - 解析器阻塞与渲染阻塞

php - Page.php 不显示 wordpress 中的更改

javascript - 使用 JQuery 更改背景图像

r - mesh3d如何为三角形的面着色 R Plotly

Python:我可以在时间序列等值线中使颜色条静态化吗?

javascript - 在扩展 react 组件中绑定(bind)套接字

javascript - 无法从 $_POST 变量访问使用 JSON.stringify 序列化的表单数据