2016-07-15 72 views
2

我需要在plotly.js中自定义图形的悬停交互。我显示时间序列,并希望悬停光标只是一条垂直线。光标下方的值应显示在图表下方的表格中(不在图表本身内)。我设法显示垂直线光标并显示下表中的值,但无法弄清楚如何禁用显示图中的值(我的意思是悬停在图上时具有值的形状的工具提示),请参阅代码段。如何在悬停事件触发时隐藏悬停的值信息?

我只发现我可以通过在布局上设置属性hovermode: false来禁用工具提示,但是没有发生悬停事件,我需要绘制垂直线光标。

有没有办法做到这一点?

var gd = document.getElementById('tester'); 
 
var hoverInfo = document.getElementById('hoverinfo'); 
 

 
var traceX = { 
 
    name: "X", 
 
    x: ['2001-06-11 11:50', '2001-06-12 00:00', '2001-06-12 12:30'], 
 
    y: [35, 21, 28], 
 
    type: 'scatter', // set the chart type 
 
    mode: 'lines+markers', 
 
    line: { 
 
    width: 1 
 
    } 
 
}; 
 

 
var cursor1 = { 
 
    xid: 1, 
 
    type: 'line', 
 
    // x-reference is assigned to the x-values 
 
    xref: 'x', 
 
    // y-reference is assigned to the plot paper [0,1] 
 
    yref: 'paper', 
 
    x0: '2001-06-12 12:30', 
 
    y0: 0, 
 
    x1: '2001-06-12 12:30', 
 
    y1: 1, 
 
    fillcolor: '#d3d3d3', 
 
    opacity: 0.1, 
 
}; 
 

 
var layout = { 
 
    yaxis: { 
 
    title: "Wind Speed", 
 
    hoverformat: '' 
 
    }, // set the y axis title 
 
    xaxis: { 
 
    showgrid: false, // remove the x-axis grid lines 
 
    tickformat: "%B, %Y", // customize the date format to "month, day" 
 
    hoverformat: '' 
 
    }, 
 
    margin: { // update the left, bottom, right, top margin 
 
    l: 40, 
 
    b: 40, 
 
    r: 20, 
 
    t: 20 
 
    }, 
 
    showline: true, 
 
    hovermode: 'x', 
 
    shapes: [] 
 
}; 
 

 
var hoverFn = function(data) { 
 
    if (gd.layout.shapes.length === 0) { 
 
    gd.layout.shapes.push(cursor1); 
 
    } 
 
    var update = { 
 
    'shapes[0].x0': data.points[0].x, 
 
    'shapes[0].x1': data.points[0].x 
 
    }; 
 
    Plotly.relayout(gd, update); 
 

 
    var infotext = data.points.map(function(d) { 
 
    return (d.data.name + ': ' + d.x + ' | ' + d.y.toPrecision(3)); 
 
    }); 
 

 
    hoverInfo.innerHTML = infotext.join('<br/>'); 
 
}; 
 

 
var unhoverFn = function(data) { 
 
    //hoverInfo.innerHTML = ''; 
 
} 
 

 
var draw = function(data, layout) { 
 

 
    Plotly.newPlot(gd, data, layout, { 
 
    showLink: false, 
 
    displaylogo: false 
 
    }); 
 

 
    gd.on('plotly_click', function(data) { 
 
     //console.log('click'); 
 
    }) 
 
    .on('plotly_beforehover', function(data) { 
 
     //console.log('beforehover'); 
 
    }) 
 
    .on('plotly_hover', function(data) { 
 
     //var pointNum = data.points[0].pointNumber; 
 
     var pointNum = data; 
 
     hoverFn(data); 
 
    }) 
 
    .on('plotly_unhover', function(data) { 
 
     unhoverFn(data); 
 
    }); 
 

 
    Plotly.addTraces(gd, [traceX]); 
 
}; 
 

 
Plotly.d3.csv('https://raw.githubusercontent.com/plotly/datasets/master/wind_speed_laurel_nebraska.csv', function(rows) { 
 
    var data = [{ 
 
    name: 'P1', 
 
    type: 'scatter', // set the chart type 
 
    mode: 'lines', // connect points with lines 
 
    x: rows.map(function(row) { // set the x-data 
 
     return row['Time']; 
 
    }), 
 
    y: rows.map(function(row) { // set the x-data 
 
     return row['10 Min Sampled Avg']; 
 
    }), 
 
    line: { // set the width of the line. 
 
     width: 1 
 
    } 
 
    }, { 
 
    name: 'P2', 
 
    type: 'scatter', // set the chart type 
 
    mode: 'lines', // connect points with lines 
 
    x: rows.map(function(row) { // set the x-data 
 
     return row['Time']; 
 
    }), 
 
    y: rows.map(function(row) { // set the x-data 
 
     return Number(row['10 Min Sampled Avg']) + 3.0; 
 
    }), 
 
    line: { // set the width of the line. 
 
     width: 1 
 
    } 
 
    }]; 
 

 
    draw(data, layout); 
 
});
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script> 
 
<div id="tester" style="width:600px;height:300px;"></div> 
 
<div id="hoverinfo" style="margin-left:80px;"></div>

回答

3

发现了它。将Plotly.Fx.hover(gd, []);加入我的hoverFn()。数组(第二个参数)指定显示哪些点,只需将其保留为空即可。

(关于这个example在文档基于)

var gd = document.getElementById('tester'); 
 
var hoverInfo = document.getElementById('hoverinfo'); 
 

 
var traceX = { 
 
    name: "X", 
 
    x: ['2001-06-11 11:50', '2001-06-12 00:00', '2001-06-12 12:30'], 
 
    y: [35, 21, 28], 
 
    type: 'scatter', // set the chart type 
 
    mode: 'lines+markers', 
 
    line: { 
 
    width: 1 
 
    } 
 
}; 
 

 
var cursor1 = { 
 
    xid: 1, 
 
    type: 'line', 
 
    // x-reference is assigned to the x-values 
 
    xref: 'x', 
 
    // y-reference is assigned to the plot paper [0,1] 
 
    yref: 'paper', 
 
    x0: '2001-06-12 12:30', 
 
    y0: 0, 
 
    x1: '2001-06-12 12:30', 
 
    y1: 1, 
 
    fillcolor: '#d3d3d3', 
 
    opacity: 0.1, 
 
}; 
 

 
var layout = { 
 
    yaxis: { 
 
    title: "Wind Speed", 
 
    hoverformat: '' 
 
    }, // set the y axis title 
 
    xaxis: { 
 
    showgrid: false, // remove the x-axis grid lines 
 
    tickformat: "%B, %Y", // customize the date format to "month, day" 
 
    hoverformat: '' 
 
    }, 
 
    margin: { // update the left, bottom, right, top margin 
 
    l: 40, 
 
    b: 40, 
 
    r: 20, 
 
    t: 20 
 
    }, 
 
    showline: true, 
 
    hovermode: 'x', 
 
    shapes: [] 
 
}; 
 

 
var hoverFn = function(data) { 
 
    Plotly.Fx.hover(gd, []); 
 
    if (gd.layout.shapes.length === 0) { 
 
    gd.layout.shapes.push(cursor1); 
 
    } 
 
    var update = { 
 
    'shapes[0].x0': data.points[0].x, 
 
    'shapes[0].x1': data.points[0].x 
 
    }; 
 
    Plotly.relayout(gd, update); 
 

 
    var infotext = data.points.map(function(d) { 
 
    return (d.data.name + ': ' + d.x + ' | ' + d.y.toPrecision(3)); 
 
    }); 
 

 
    hoverInfo.innerHTML = infotext.join('<br/>'); 
 
}; 
 

 
var unhoverFn = function(data) { 
 
    //hoverInfo.innerHTML = ''; 
 
} 
 

 
var draw = function(data, layout) { 
 

 
    Plotly.newPlot(gd, data, layout, { 
 
    showLink: false, 
 
    displaylogo: false 
 
    }); 
 

 
    gd.on('plotly_click', function(data) { 
 
     //console.log('click'); 
 
    }) 
 
    .on('plotly_beforehover', function(data) { 
 
     //console.log('beforehover'); 
 
    }) 
 
    .on('plotly_hover', function(data) { 
 
     //var pointNum = data.points[0].pointNumber; 
 
     var pointNum = data; 
 
     hoverFn(data); 
 
    }) 
 
    .on('plotly_unhover', function(data) { 
 
     unhoverFn(data); 
 
    }); 
 

 
    Plotly.addTraces(gd, [traceX]); 
 
}; 
 

 
Plotly.d3.csv('https://raw.githubusercontent.com/plotly/datasets/master/wind_speed_laurel_nebraska.csv', function(rows) { 
 
    var data = [{ 
 
    name: 'P1', 
 
    type: 'scatter', // set the chart type 
 
    mode: 'lines', // connect points with lines 
 
    x: rows.map(function(row) { // set the x-data 
 
     return row['Time']; 
 
    }), 
 
    y: rows.map(function(row) { // set the x-data 
 
     return row['10 Min Sampled Avg']; 
 
    }), 
 
    line: { // set the width of the line. 
 
     width: 1 
 
    } 
 
    }, { 
 
    name: 'P2', 
 
    type: 'scatter', // set the chart type 
 
    mode: 'lines', // connect points with lines 
 
    x: rows.map(function(row) { // set the x-data 
 
     return row['Time']; 
 
    }), 
 
    y: rows.map(function(row) { // set the x-data 
 
     return Number(row['10 Min Sampled Avg']) + 3.0; 
 
    }), 
 
    line: { // set the width of the line. 
 
     width: 1 
 
    } 
 
    }]; 
 

 
    draw(data, layout); 
 
});
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script> 
 
<div id="tester" style="width:600px;height:300px;"></div> 
 
<div id="hoverinfo" style="margin-left:80px;"></div>

0

另一种解决方案是使用hoverinfo值并将其设置为出现在参考 '无':https://plot.ly/javascript/reference/#scatter-hoverinfo

是这样的:

var trace1 = 
{ 
    x: [1, 2, 3], 
    y: [40, 50, 60], 
    name: 'data1', 
    type: 'scatter', 
    hoverinfo: 'none' 
}; 

好处是,无人驾驶事件仍然火灾。如果您改用Plotly.Fx.hover(gd, []);,则不会触发非停留事件。

从参考复制: hoverinfo(flaglist字符串)

的 “X” 的任何组合, “Y”, “Z”, “文本”, “名称” 接合用 “+” 或“全部”或“无”或“跳过”。 示例:“x”,“y”,“x + y”,“x + y + z”,“全部” 默认值:“全部” 确定在悬停时显示哪些跟踪信息。如果设置了noneskip,则悬停时不显示任何信息。但是,如果设置了none,则点击和悬停事件仍会触发。