2016-12-30 4 views
5

У меня проблемы с правильной позицией пользовательской всплывающей подсказки на платной карте Plotly.js.Пользовательское позиционирование подсказки

Я использую метод l2p (для чего этот акроним стоит?) В сочетании с данными pointNumber, чтобы получить относительное позиционирование в тепловой карте. Это выглядит следующим образом:

x: point.xaxis.l2p(point.pointNumber[1]), 
y: point.yaxis.l2p(point.pointNumber[0]) 

Но проблема в том, что она является относительно верхнего/левого происхождения тепловой карты SVG себя без наружных х- и у-меток по оси, так что я на самом деле не хватает, что и интересно, не существует ли встроенной функции для получения этой информации о местоположении напрямую? Проблема с использованием внешних divs в качестве области подсказки заключается в том, что они полностью расположены за пределами диаграммы, и мне нужна информация со ссылкой на верхнее/левое начало вне диаграммы и обозначение оси.

Что, кажется, работает, чтобы использовать ось частного _offset свойства и добавить его к й и у позиции выше, поэтому я получаю

x: point.xaxis.l2p(point.pointNumber[1]) + point.xaxis._offset, 
y: point.yaxis.l2p(point.pointNumber[0]) + point.yaxis._offset 

Но это выглядит довольно неприятным для меня. Может ли кто-нибудь указать мне на какую-то документацию или демонстрацию о том, как это сделать? для тепловой карты?

ответ

1

Вы можете использовать функции Javascript pageX and pageY и объединить их с событием зависания Plotly.

Вы можете получить позицию курсора в абсолютных пикселях и использовать ее напрямую. В фрагменте ниже точки перемещается вместе с курсором, когда мышь находится над Plotly div. Его размер и цвет определяются данными, по которым расположен курсор.

Конечно, вы можете связать событие onmousemove с любой частью участка и сделать что-то более сложное, чем просто точка.

//create some random data 
 
var data = [{z: [], type: 'heatmap'}]; 
 
var z = []; 
 
\t 
 
for (var i = 0; i < 10; i += 1) { 
 
    z = []; 
 
    for (var j = 0; j < 10; j += 1) { 
 
    z.push(Math.random()); 
 
    } 
 
    data[0].z.push(z); 
 
} \t 
 

 
var myPlot = document.getElementById('myDiv'); 
 
var myPoint = document.getElementById('myPoint'); 
 
var colors = Plotly.d3.scale.category20(); 
 

 
//move the red dot 
 
myPlot.onmousemove = function(event) { 
 
    myPoint.style.left = event.pageX + "px"; 
 
    myPoint.style.top = event.pageY + "px"; 
 
} 
 
myPlot.onmouseleave = function() { 
 
    myPoint.style.left = "-999px"; 
 
    myPoint.style.top = "-999px"; 
 
} 
 

 
//create the plot 
 
Plotly.newPlot('myDiv', data); 
 
//use Plotly's hover event to get the data 
 
myPlot.on('plotly_hover', function(data){ 
 
\t myPoint.style.border = "solid " + (2 + (data.points[0].z * 5)) +"px " + colors(Math.abs(1 - data.points[0].z)); 
 
});
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script> 
 
<div id='myDiv'> 
 
</div> 
 
<div id="myPoint" style="top: -999px; left: -999px; border: 5px solid #ff0000; border-radius: 50%; position: absolute; z-index: 999;"> 
 
</div>

+0

Hi Maximilian, Да, я знаю о свойствах событий pageX/Y, но моя точка - это интеграция с данными сюжета: как вы хотите получить доступ к базовым данным Plotly, которые вы наводили на себя? Именно по этой причине я использую событие 'plotly_hover', потому что это цель этого события, но, к сожалению, я не могу найти какую-либо информацию на страницеX/Y в данных ответа, которая бы решила проблему. – andi1984

+0

@ andi1984: см. Обновленный фрагмент. Теперь он использует как данные, так и атрибуты pageX/Y. –

+0

Thx для вашего обновления. Я могу понять, как использовать mousemove для обновления позиции и использовать встроенный внутренний для работы с данными. Но, честно говоря, этот подход выглядит как исправление вокруг Plotly API, чтобы сделать это возможным. Это способ сделать это наверняка, но я бы предположил, что я могу сделать то же самое в этом обратном вызове событий заговора! Так что это не тот ответ, о котором я думал. Тем не менее thx за помощь и ответ! Я дам вам щедрость, если это будет единственный ответ на мой вопрос в ближайшие дни. – andi1984

 Смежные вопросы

  • Нет связанных вопросов^_^