我使用vis.js Graph3d库用我的数据绘制3D图形。假设X轴代表我的节点,Y轴代表最后5个小时,Z轴代表值。对于我想要表示为空格的节点没有读数,可能会有几个小时。如果第一个节点包含所有小时的数据,并且后续节点在几个小时内缺少数据,则此方法可以正常工作。
This示例小提示演示了它只考虑2个节点。
现在,如果第一个节点缺少数据,那么在旋转图形时,渲染内容会与条形图相互重叠。
This小提琴演示了相同的内容。这个帖子也是如此。
奇怪的部分,如果你修改数据填充而不是跳过第二个小时的数据,跳过它任何其他小时,图形渲染完美。例如this小提琴。
有人能告诉我这里发生了什么吗?
我通过在开头有一个额外的虚拟节点来做一个临时的解决方法,其中z轴的所有值都设置为0.如果有人建议修改,我会很高兴。
提前致谢。
var data = null;
var graph = null;
/**
* Returns a random number between min (inclusive) and max (exclusive)
*/
function getRandomArbitrary(min, max) {
return Math.random() * (max - min) + min;
}
// Called when the Visualization API is loaded.
function drawVisualization() {
var style = 'bar';
// Create and populate a data table.
data = new vis.DataSet();
//Poppulating the data
for (var y = 1; y <= 5; y++) {
if(y==2) {
continue;
}
var z = getRandomArbitrary(1,5);
data.add({x:1, y:y, z:z});
}
for (var y = 1; y <= 5; y++) {
var z = getRandomArbitrary(1,5);
data.add({x:2, y:y, z:z});
}
// specify options
var options = {
width: '700px',
height: '700px',
style: style,
showPerspective: true,
showGrid: true,
showShadow: false,
verticalRatio: 0.5,
zMin: 0,
zMax: 5,
xStep: 1,
xCenter: '50%',
yCenter: '30%',
// Option tooltip can be true, false, or a function returning a string with HTML contents
//tooltip: true,
tooltip: function (point) {
// parameter point contains properties x, y, z
return 'value: <b>' + point.z + '</b>';
},
keepAspectRatio: true,
verticalRatio: 0.5
};
var camera = graph ? graph.getCameraPosition() : null;
// create our graph
var container = document.getElementById('mygraph');
graph = new vis.Graph3d(container, data, options);
if (camera) graph.setCameraPosition(camera); // restore camera position
var pos = {horizontal: 1.0, vertical: 0.5, distance: 2};
graph.setCameraPosition(pos);
}
drawVisualization();
html, body {font: 10pt arial;
padding: 0;
margin: 0;
width: 100%;
height: 100%;
}
#mygraph {
padding: 0;
margin: 0;
width: 100%;
height: 100%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/vis/3.6.4/vis.min.js">
</script>
<body>
<div id="mygraph"></div>
</body>
答案 0 :(得分:1)
发布我从开发者那里得到的答案。
如果未配置,Graph3d会根据第一个和第二个条之间的距离自动检测条宽。您可以手动配置条宽:
var options = {
xBarWidth: 1,
yBarWidth: 1,
// ...
}
答案 1 :(得分:1)
我很高兴地报告此问题已在vis.js v4.19.1
中修复。
如果未指定明确的条宽和/或高度,则这些值现在将默认为数据点之间的最小距离(每个维度)。因此,所有数据点都被考虑,而不仅仅是前两个。
此外,不再需要对数据点进行排序以确定初始值。